Pierwsza lista to [5,5,3,7,6] i nazywa się FirstList, inna lista to [5,5,5] i nazywa się SecList. Kiedy wywołuję metodę ContainsAll, taką jak ta FirstList.containsAll(SecList), aby sprawdzić, czy FirstList zawiera SecList. Oczywiście odpowiedź jest fałszywa, ale metoda ContainsAll zwraca true, to niepoprawny wynik.

Cały kod jest następujący:

    List<Integer> FirstList = new ArrayList<>();
    List<Integer> SecList = new ArrayList<>();

    for (int j = 0; j < 3; j++)
    {
        SecList.add(5);
    }

    FirstList.add(5);
    FirstList.add(5);
    FirstList.add(3);
    FirstList.add(7);
    FirstList.add(6);
    System.out.println("FirstList: " + FirstList);
    System.out.println("SecList: " + SecList);
    System.out.println("FirstList contains SecList?  " + FirstList.containsAll(SecList));

A wyjście to:

FirstList: [5,5,3,7,6]
SecList: [5,5,5]
FirstList contains SecList? true

Wygląda na to, że ta metoda może dać poprawne wyniki tylko wtedy, gdy lista nie zawiera zduplikowanych elementów. Czy istnieje sposób na proste osiągnięcie tej logiki? Proszę wybacz mój słaby angielski i naprawdę doceniam twoją pomoc.

3
Grenic_Mars 5 styczeń 2022, 07:41
.contains i .containsAll to metody Collection. Na początek nie wszystkie kolekcje obsługują duplikaty. A logika jest prosta: jeśli przeszukasz każdy element tej kolekcji, czy możesz znaleźć w tej kolekcji taki sam element? I to jest prawda w twoim przykładzie.
 – 
ernest_k
5 styczeń 2022, 07:47
Ponieważ lista second ma tylko trzy elementy, to lista first zawiera wszystkie te same elementy, więc staje się true. Możliwe, że należy sprawdzić, czy obie listy mają ten sam rozmiar, ale jest to szczegół implementacji
 – 
MadProgrammer
5 styczeń 2022, 07:54

1 odpowiedź

Najlepsza odpowiedź

„Oczywiście odpowiedź jest fałszywa”

Odpowiedź jest prawdziwa i powinna być prawdziwa. Dla każdego elementu e w SecList, FirstList.contains(e) zwraca prawdę. Tak ma działać containsAll; tutaj nie ma błędu.

Jeśli chcesz tego zachowania, będziesz musiał zliczyć elementy w każdej kolekcji, być może z Map<E, Integer> lub Guava Multiset, a następnie porównać zliczenia każdego elementu.

6
Louis Wasserman 5 styczeń 2022, 07:51