• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed JAVA - zadanie/ problem z użyciem HashSetow/ problem z tworzeniem listy ktora zawiera tablice z charami

Object Storage Arubacloud
0 głosów
289 wizyt
pytanie zadane 24 marca 2021 w Java przez Patryk2001 Początkujący (470 p.)
zamknięte 26 marca 2021 przez Patryk2001

Witam,

Mój problem wygląda następująco. Mam do zrobienia zadanie które brzmi tak:

Znajdź słowo, w którym występuje największa liczba różnych liter. Wypisz to słowo i liczbę występujących w nim różnych liter. Jeśli słów o największej liczbie różnych liter jest więcej niż jedno, wypisz pierwsze z nich pojawiające się w pliku z danymi. Dla danych z pliku przyklad.txt wynikiem jest: AKLMNOPRSTWZA 12

W pliku posiadam 1000 wierszy z różnymi słowami

Wpadłem na pomysł że mogę Stworzyć Listę, która będzie zawierała X tablic z Charami tzn. np. pierwsze słowo trafia do listy, jest rozkładane na znaki i każdy ten znak trafia do tablicy. I jak już będę miał cała tą listę gotową, to wtedy użyje HashSety które zwrócą mi do każdej tablicy tylko unikalne elementy, Na samym końcu będzie tylko trzeba sprawdzić która tablica zawiera największą ilość znaków. I teraz mam lekki problem bo nie wiem czy dobrze zadeklarowałem taką listę z tablicami, i nie wiem czy w ogóle to można zrobić. Gdyby ktoś zechciał pomóc byłbym wdzięczny :)

public static void Zadanie2() throws IOException
	{	
		BufferedReader br = null;
		FileWriter fw = null;
		
		try 
		{
			br = new BufferedReader(new FileReader(sd));
			fw = new FileWriter(sp);
			String l;			
			int max = 0;
			List <char[]> ListaSlow = new ArrayList<char[]>();
			int p = 0;
			
		
			while((l = br.readLine()) != null) 
			{
				
				for(int i = 0; i < l.length(); i++) 
				{
					ListaSlow.add(p, l.charAt(i));				}
				
				p++;
			}		
		
		}
		
		finally 
		{
			
			if(br != null) 
			{
				br.close();
			}
			if(fw != null) 
			{
				fw.close();
			}
		}
		
	}

 

EDIT:

Rozwiązanie tego zadania wygląda następująco:

public static void Zadanie2() throws IOException
	{	
		BufferedReader br = null;
		FileWriter fw = null;
		
		try 
		{
			br = new BufferedReader(new FileReader(sd));
			fw = new FileWriter(sp);
			String l;			
			int max = 0;
			String slowo = "";
			Set<Character> UnikalneZnaki = new HashSet<Character>();
		
			
		
			while((l = br.readLine()) != null) 
			{	
				char[] znaki = l.toCharArray();
				
				for(int i= 0; i< znaki.length; i++) 
				{
					UnikalneZnaki.add(znaki[i]);
					
				}	
				
				if(UnikalneZnaki.size() > max) 
				{
					max = UnikalneZnaki.size();
					slowo = l;	
				}
			
				UnikalneZnaki.clear();
			}	
			
			System.out.print(slowo + " " + max);
		
		}
		
		finally 
		{
			
			if(br != null) 
			{
				br.close();
			}
			if(fw != null) 
			{
				fw.close();
			}
		}
		
	}
	

 

 

komentarz zamknięcia: Zadanie rozwiązane

1 odpowiedź

+1 głos
odpowiedź 24 marca 2021 przez Wiciorny Ekspert (269,810 p.)

Mam tutaj lepszy i prosty algorytym :

Idziesz linia po lini w pliku, wczytując wyrazy tak ?  Więc twoja funkcja powinna : sugeruje :

1- czytając każde słowo zliczasz liczbe różnych liter i zapisujesz ile ich wyszło, przechodząc do następnego słowa
2- zliczasz ilość liter róznych dla tego słowa
3- porównujesz teraz czy poprzednio zapisana liczba ( dla poprzedniego słowa ) jest większa niż aktualna? Jesli tak to nic nie robisz zostawiasz, jeśli nie to zamieniassz i liczysz dalej


W ten sposób po przejściu dostaniesz słowo z największa liczbą znaków różnych, dodatkowo ten zapis zrobił bym na zasadzie mapy np.
po przejściu słowa zapisujesz do mapy Map<integer.String>  wartosci; - gdzie jako np. klucz podasz długość liter róznych i w stringu zachować  możesz to słowo, aby potem przy końcu nie tyle mieć najbardziej "skomplikowane, tzn słowo mające najwięcej różnych liter"  co właśnie liczbę tych liter czyli dwie rzeczy

Okej, ale co jeśli jest więcej takich slów? Wtedy pierwsze z nich masz wpisać, no to możesz podejść sprytniej do problemu, żeby nie tworzyć dodatkowych przechowywań 1-ego wystąpienia, CZYTAĆ PLIK OD TYŁU wtedy osatnim - słowem które jakby było najbardziej skomplikowane, pozostanie jako 1-sze więc wynikowo będzie dobrze 

1
komentarz 24 marca 2021 przez Patryk2001 Początkujący (470 p.)

Zadanie rozwiązane, ale moim sposobem :D tutaj rozwiązanie:

	public static void Zadanie2() throws IOException
	{	
		BufferedReader br = null;
		FileWriter fw = null;
		
		try 
		{
			br = new BufferedReader(new FileReader(sd));
			fw = new FileWriter(sp);
			String l;			
			int max = 0;
			String slowo = "";
			Set<Character> UnikalneZnaki = new HashSet<Character>();
		
			
		
			while((l = br.readLine()) != null) 
			{	
				char[] znaki = l.toCharArray();
				
				for(int i= 0; i< znaki.length; i++) 
				{
					UnikalneZnaki.add(znaki[i]);
					
				}	
				
				if(UnikalneZnaki.size() > max) 
				{
					max = UnikalneZnaki.size();
					slowo = l;	
				}
			
				UnikalneZnaki.clear();
			}	
			
			System.out.print(slowo + " " + max);
		
		}
		
		finally 
		{
			
			if(br != null) 
			{
				br.close();
			}
			if(fw != null) 
			{
				fw.close();
			}
		}
		
	}

 

komentarz 26 marca 2021 przez Patryk2001 Początkujący (470 p.)
Teraz zauważyłem że ostatnio wkleiłem zły kod, więc zrobiłem Edit u góry i dałem poprawny kod, to co jest powyżej jest błędne pozdrawiam :D

Podobne pytania

0 głosów
1 odpowiedź 128 wizyt
pytanie zadane 15 grudnia 2019 w Java przez smokolisz Mądrala (6,340 p.)
0 głosów
2 odpowiedzi 1,157 wizyt
0 głosów
1 odpowiedź 129 wizyt
pytanie zadane 31 sierpnia 2018 w Java przez kvbq Obywatel (1,490 p.)

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...