Wyświetlanie konkretnych elementów kolekcji LinkedHashSet

0

Hej

Chciałem porównać konkretne elementy z listy LinkedHashSet z elementami kolekcji ArrayList.
Element z ArrayLits wyciągnę metodą get() ale nie wiem jak porównać go do pierwszego (finalnie każdy element z jednek kolekcji do każdego elementu z drugiej kolekcji) elementu z kolekcji LinkedHashSet.
Użyłem LinkedHashSet, bo potrzebuje unikalne elementy, dodatkowo przeczytałem, że pamięta kolejność wstawiania. Pomyślałem, że można to w jakis sposób wykorzystać przy porównywaniu.

1

Wystarczy, że stworzysz iterator:

LinkedHashSet<String> mySet = new LinkedHashSet<String>();
Iterator<String> i = mySet.iterator();
while(i.hasNext()) {
    System.out.println(i.next());
}
0
Haskell napisał(a):

Wystarczy, że stworzysz iterator:

LinkedHashSet<String> mySet = new LinkedHashSet<String>();
Iterator<String> i = mySet.iterator();
while(i.hasNext()) {
    System.out.println(i.next());
}

Mam iterator w pętli, która mi porównuje wartości dwóch kolekcji. Za drugim cyklem w pętli, robi takie wrażenie (zdebagowałem), że iterator już nic nie czyta.
Coś robię źle?
Pierwszy raz korzystam z iteratora i domyślam się, że czegoś nie rozumiem.

Pętla:

        for(int j = 0; j < lista.size(); j++)
        {
        for(int i = 0; i < ts.size(); i++)  
        {  
        	while(it.hasNext())
        	{
        		if(lista.get(j).equals(it.next()))  
        		{  
        			licznik++;  
        		}  
        	}
        }
        }

Cały kod:

public class Patryk 
{  
    static int licznik = 0;  
  
    public static void main(String[] args)   
    {  
        liczenie();  
    }  
  
    public static void liczenie()  
    {  
        File plik = new File("plik");  
        File plik2 = new File("plik2");  
  
        try  
        {  
        BufferedReader czytacz = new BufferedReader(new FileReader(plik)); 
        BufferedReader czytacz2 = new BufferedReader(new FileReader(plik2)); 
        
        String wiersz = null; 
        String wiersz2 = null;

        ArrayList<String> lista = new ArrayList<String>(); 
        
        LinkedHashSet<String> ts = new LinkedHashSet<String>();
//      Iterator<String> it = ts.iterator();
  
        while((wiersz = czytacz.readLine()) != null)  
        {  
            System.out.println(wiersz); 
            lista.add(wiersz); 
        }  
        
        while((wiersz2 = czytacz2.readLine()) != null)
        {
        	ts.add(wiersz2);
        }
        Iterator<String> it = ts.iterator();
        
        for(int j = 0; j < lista.size(); j++)
        {
        for(int i = 0; i < ts.size(); i++)  
        {  
        	while(it.hasNext())
        	{
        		if(lista.get(j).equals(it.next()))  
        		{  
        			licznik++;  
        		}  
        	}
        }
        }
        
        System.out.println(lista.size() + " rozmiar"); 
        }  
        catch(Exception ex)  
        {  
            ex.printStackTrace();  
        }  
        System.out.println(licznik);  
    }  
} 
1

Zdecydowanie robisz to źle. Iterator działa w taki sposób, że przechodzi raz przez listę elementów. Tymczasem w tym kodzie widzę dwie pętle for i pętle while. W sumie przejść jest dużo więcej niż elementów ma iterator.

Z tego co rozumiem chcesz porównać każdy element listy z każdym elementem setu. W takim razie musisz resetować iterator po każdym przejściu przez wszystkie elementy.

it = ts.iterator();

Poza tym nie potrzebujesz pętli for przechodzącej przez elementy setu, jeżeli masz już pętle while.

Poprawny kod będzie wyglądał mniej więcej tak:

for(int j = 0; j < lista.size(); j++)
        {
            it = ts.iterator();
            while(it.hasNext())
            {
                if(lista.get(j).equals(it.next()))  
                {  
                    licznik++;  
                }  
            }
        }

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