czy to HashSet?

0

czesc

metoda ma zadanie dodac do tablicy stringi generowane przez inną metode (ta dziala) uprzednio sprawdzajac za pomoca hashset czy podobny string nie zostal juz dodany.

nie potrafie ustalic dlaczego ponizsza metoda losowo, na starcie wpada w neiskonczona petle lub dziala bez zarzutu

prosze o pomoc

thx

	 

public void storeRandomized()
	 {
	 	Set noduplicates = new HashSet();
	 	
	 	
	 	int i, a;
	 	
	 	for (a=0; a<4; a++)
	 	{
	 		
	 		i=0;
	 	             //ta petla sie mota
	 		while (i<3)
	 		{	
	 			String okString = returnRandomized(a); 
                                           //ta metoda działa; zwraca losowy string
	 			
	 				
	 			if (!noduplicates.contains(okString))
	 			{
	 				
	 				exampleDisplay[index] = okString;
	 				noduplicates.add(okString);
	 				index++;
	 				i++;
	 			}
	 			
	 			else
	 			{
	 
	 				System.out.println("fuuu...");
	 				//powtarza sie ten komunikat	 				 					 		
	 			}
	 		}
	 	}
	 }

0

Zmienna i jest modyfikowana warunkowo. Jeżeli zdarzy się ten przypadek, że jednak wylosowany string się powieli, to od tego momentu i nie jest inkrementowane i pętla staje się nieskończona pytając cały czas o warunek, który nie musi się zmienić. Dlatego zawsze staraj się używać for jeżeli jest zmienna sterująca. Przy while trzeba więcej uwagi. Formalnie okString powinien mieć nową wartość przy każdym obrocie, ale tutaj mogła zadziałać optymalizacja kompilatora co do warunku if lub returnRandomized() przy zerowym lub małym a nie jest aż tak losowa jakby się wydawała.

Poza tym trochę źle nazwałeś ten zbiór HashSet. Nazwa nie jest szczęśliwa. Lepiej byłoby nazwać ją tested lub added, co w połączeniu z contains dałoby bardziej czytelny warunek tego co o co naprawdę pytasz.
Poza tym cała sekcja else powinna zniknąć. Powielenie stringa powinno zostać zignorowane bo jest częścią przetwarzania, a nie jakimś błędem. i++ wyrzuć poza blok warunku if. Dobrze jest też inkrementować indeks tam gdzie coś się zmienia o ile zmienia się tylko jeden raz. Dlatego jak bym wrzucił go tak:

exampleDisplay[index++] = okString;

albo nawet tak:

noduplicates.add(exampleDisplay[index++] = okString);

redukując w ten sposób blok do instrukcji i wymuszając wyrzucenie i++ tam gdzie powinno być.

0

dziekuje Olamagato

jeszcze tylko prosba

Formalnie okString powinien mieć nową wartość przy każdym obrocie, ale tutaj mogła zadziałać optymalizacja kompilatora co do warunku if lub returnRandomized() przy zerowym lub małym a nie jest aż tak losowa jakby się wydawała.

mozesz podac jakis link ktory dokladnie objasnia optymalizacje o ktorej mowisz.
bede czesto korzystal z klasy Random i musze nauczyc sie unikac takich kwiatkow.

Poza tym cała sekcja else powinna zniknąć. Powielenie stringa powinno zostać zignorowane bo jest częścią przetwarzania, a nie jakimś błędem.

ten else to tylko pomoc w odnalezieniu bledu :)))

pozdr

ukii

1 użytkowników online, w tym zalogowanych: 0, gości: 1