2013-01-24 28 views
25

Prawdopodobnie jest prosta-liner, że ja po prostu nie znaleźć tutaj, ale to jest moje pytanie:ArrayList zawiera inny ArrayList

Jak sprawdzić, czy ArrayList zawiera wszystkie obiekty w innym ArrayList. Szukam (jeśli istnieje) na coś wzdłuż linii:

//INCORRECT EXAMPLE: 
if(one.contains(two)) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

Na przykład:

ArrayList one = {1, 2, 3, 4, 5} 

ArrayList two = {1, 2, 3} --> True 
ArrayList two = {} --> True 
ArrayList two = {1, 2, 3, 4, 5} --> True 
ArrayList two = {1, 5, 2} --> True 
ArrayList two = {1, 7, 4} --> False 
ArrayList two = {0, 1, 3} --> False 
ArrayList two = {4, 5, 6} --> False 
ArrayList two = {7, 8, 9} --> False 
+1

{1,3,2} = prawda czy fałsz? – cowls

+0

prawda. dziękuję za aktualizację – Evorlor

+0

w takim przypadku, gdy chcesz zawieraAll (już odpowiedź) – cowls

Odpowiedz

49

Istnieje metoda o nazwie containsAll zadeklarowana w interfejsie java.util.Collection. W ustawieniu one.containsAll(two) podajesz żądaną odpowiedź.

3

Kod na przykład nie ma sensu, ale tutaj jest przykład tak.

ArrayList<Integer> one, two; 
//initialize 
boolean good = true; 
for (int i = 0; i < two.size(); i ++) { 
    if (!(one.contains(two.get(i))) { 
     good = false; 
     break; 
    } 
} 

To po prostu pętli poprzez wszystkie elementy i kontroli two „s, aby sprawdzić, czy są one w one.

Następnie wartość boolean good zawiera żądaną wartość.

Zobacz ArrayList#contains.

EDYTOWANIE: oh wow, całkowicie zapomniałem containsAll. No cóż, to alternatywny sposób, aby to zrobić, jeśli naprawdę chcesz to zrozumieć.

+3

Po przejściu "false" powinieneś "zepsuć". Nie musisz sprawdzać reszty. –

+0

@LeeMeador Yep, dzięki – Doorknob

+2

Alternatywnie (zamiast przerwy) możesz zrobić: dla (int i = 0; i MadcoreTom

10

Spójrz na containsAll(Collection<?> c) metody z List interfejsu. Myślę, że to jest to, czego szukasz.

3

Możesz użyć metody containsAll na liście, aby wykonać czek. Jest to jednak operacja liniowa. Jeśli lista jest duża, należy przekonwertować go do HashSet pierwszy, a następnie wykonać containsAll:

HashSet tmp = new HashSet(one); 
if (tmp.containsAll(two)) { 
    ... 
} 

Jeśli długość one jest N i długość dwóch jest M, to rozwiązanie ma czas złożoność O(M+N); "zwykły" containsAll ma złożoność O(M*N), co może być znacznie gorsze.

2

Inny przykład zastosowanie containsAll (I), które są wykorzystywane do stwierdzenia, że ​​dwie tablice są równe w testach JUnit:

List<String> expected = new ArrayList<String>(); 
expected.add("this"); 
expected.add("that"); 
expected.add("another"); 

List<String> actual = new ArrayListString(); 
actual.add("another"); 
actual.add("that"); 
actual.add("this"); 

Assert.assertTrue("The lists do not match!", expected.containsAll(actual));