2011-01-31 14 views
9

Mam ArrayList<int[]> i dodałem do niej tablicę.Użycie zawiera na tablicy ArrayList z tablicami całkowitymi

ArrayList<int[]> j = new ArrayList<int[]>(); 
int[] w = {1,2}; 
j.add(w); 

Załóżmy, że chcemy wiedzieć, czy j zawiera tablicę, która ma {1,2} w nim bez korzystania w, ponieważ będę wywołanie go z innej klasy. Tak, tworzę nową tablicę z {1,2} w nim ...

int[] t = {1,2}; 
return j.contains(t); 

... ale to return false mimo w został dodany do listy, a w zawiera dokładnie tę samą tablicę jako t.

Czy istnieje sposób użycia zawiera takie, że mogę po prostu sprawdzić, czy jeden z elementów ArrayList ma wartość tablicy {1,2}?

Odpowiedz

7

Tablice można porównywać tylko z Arrays.equals().

Prawdopodobnie potrzebujesz ArrayList of ArrayLists.

ArrayList<ArrayList<Integer>> j = new ArrayList<ArrayList<Integer>>(); 
ArrayList<Integer> w = new ArrayList<Integer>(); 
w.add(1); w.add(2); 
j.add(w); 
ArrayList<Integer> t = new ArrayList<Integer>(); 
t.add(1); t.add(2); 
return j.contains(t); // should return true. 
+0

Niestety, nie rozwiążemy prawdziwego problemu. Co jeśli 'w' miał' 1,2,3'? –

+0

Myślałem, że użytkownik chce porównać dokładne tablice, nie wspomniał o kawałku tablicy. –

+0

Masz rację, może źle zinterpretowałem. –

0

Musisz powtórzyć listę i ręcznie sprawdzić, czy tablica spełnia twoje kryteria.

public static boolean containsSubArray(List<int[]> j, int[] sub) { 
    for (int[] arr : j) { 
     if (arr contains elements of sub) { 
     return true; 
     } 
    } 
    return false; 
} 

Jeśli chcesz dokładne dopasowanie, można skorzystać z Arrays.equals(). Nie wydaje mi się, żeby istniała funkcja biblioteczna, która zawierałaby wszystko na tablicy, więc musiałbyś napisać to sam, jeśli tego chciałeś.

0

z Java API:

public boolean contains(Object o) 

Zwraca prawdę, jeśli lista zawiera określony element. Bardziej formalnie, zwraca wartość true wtedy i tylko wtedy, gdy ta lista zawiera co najmniej jeden element e taki , który jest (o==null ? e==null : o.equals(e)).

od int[] jest prymitywną, jestem całkiem pewna, że ​​metoda .equals istnieje, więc jej domyślam się, że zawsze zwróci false.

Czy mogę polecić inny sposób przechowywania danych? może z jakimś kluczem?

+0

'int []' w rzeczywistości nie jest prymitywne. Wszystkie tablice są "Object" i dziedziczą jego implementację 'equals()', która zwraca wartość true, jeśli operandy są takie same * instance * ('==') –

+0

int [] nie jest prymitywny. int jest. int [] extends Object, ale nie przesłania 'equals()' –

+0

ah my b. starałem się uzyskać fakt, że nie zastępuje on metody equals() iw związku z tym nie może być użyty dla zawiera. – eosgood

6

Problem polega na tym, że tablice nie zastępują Object.equals(Object), więc porównanie pomiędzy dwoma wpisami lista dzieje się z równymi domyślnych() realizacja

// from Object.class 
public boolean equals(Object obj) { 
return (this == obj); 
} 

Więc trzeba iteracyjne nad listy i sprawdzić wszystkie wpisy przy użyciu Arrays.equals(int[], int[]).Oto metoda Helper, że robi to:

public static boolean isInList(
    final List<int[]> list, final int[] candidate){ 

    for(final int[] item : list){ 
     if(Arrays.equals(item, candidate)){ 
      return true; 
     } 
    } 
    return false; 
} 

Aktualizacja: Odkąd Java 8, to ma dużo prostsze:

public static boolean isInList(
     final List<int[]> list, final int[] candidate) { 

    return list.stream().anyMatch(a -> Arrays.equals(a, candidate)); 
      // ^-- or you may want to use .parallelStream() here instead 
} 
0

"zawiera" kontrole umów na rzecz równości. Więc w twoim przypadku to, co się nie udaje, to równość int []. Ponieważ Array nie zastępuje metody równości od Object, konieczne będzie obejście tego problemu w celu sprawdzenia, czy nie jest dostępne.

Jeśli musisz sprawdzić, czy nie zawierasz zabezpieczenia w ramach Array, nie masz wyboru, musisz tylko wykonać iterację w ArrayList i samemu dokonać porównania.

0

Dwie tablice tablicowe są równe iff mają ten sam numer referencyjny obiektu. Treść nie ma znaczenia.

Szukasz sposobu sprawdzenia, czy mają taką samą treść. To może pomóc:

Arrays.equals(new int[]{1,2}, new int[]{1,2}); // evaluates to true 
Arrays.equals(new int[]{1,2}, new int[]{2,1}); // evaluates to false (!) 

Jeśli zamówienie nie powinno wpłynąć na równość, konieczne będzie samodzielne wdrożenie metody statycznej równa.

0

Po pierwsze nie są one tym samym obiektem odniesienia, więc nie są równe. equals() zwróci fałsz. Dla swojego stanu zdrowia, będziesz musiał zaimplementować metodę samodzielnego porównania.

Powiązane problemy