2017-05-25 3 views
3

So, wenn ich dieses Programm ausführen zeigt, dass die ArrayList "Test" nicht das Array [5,6] innerhalb der Variablen "Position" .Wenn ich die Ausgabe überprüft, es ist eindeutig drin und ich sehe, dass "test" dieses Element enthält.Java ArrayList enthält Methode funktioniert nicht


Ausgang:

[5, 6] [5, 6] falsch

Code:

package arraylisttest; 

import java.util.ArrayList; 
import java.util.Arrays; 

public class ArrayListTest { 
    public static void main(String[] args) { 
     int[] position = { 5, 6 }; 
     ArrayList<int[]> test = new ArrayList<>(); 

     test.add(new int[] {50, 2}); 
     test.add(new int[] {0, 7}); 
     test.add(new int[] {5, 6}); 
     test.add(new int[] {2, 1}); 

     System.out.println(Arrays.toString(position)); 
     System.out.println(Arrays.toString(test.get(2))); 
     System.out.println(test.contains(position)); 
    } 
} 
+0

Was ist Ihre Frage? –

+0

ArryList # contains (obejct) prüft, ob das Objekt in der Liste ist. In Ihrem Fall ist Position das Objekt, das von 'new int [] {50, 2}' erzeugt wird. – cole

Antwort

3

Ich glaube, dass List.contains() die verwenden equals() Methode, um festzustellen, ob die Liste enthält ein gegebenes Objekt (q.v. die source code for ArrayList#contains()). Es wird nicht die zwei Punkte in jedem 2D-Array vergleichen, um zu sehen, ob sie gleich sind. Obwohl der Punkt {5, 6} logisch in der Liste angezeigt wird, ist es ein anderes Objekt als position, das Sie für den Vergleich verwenden, und daher schlägt der Vergleich fehl.

Beachten Sie, dass der folgende Code würde verhalten haben wie erwartet:

int[] position = { 5, 6 }; 
ArrayList<int[]> test = new ArrayList<>(); 
test.add(new int[] {50, 2}); 
test.add(new int[] {0, 7}); 
test.add(position); 
test.add(new int[] {2, 1}); 

System.out.println(Arrays.toString(position)); 
System.out.println(Arrays.toString(test.get(2))); 

System.out.println(test.contains(position)); 
+0

Ja, 'contains()', in diesem Fall , würde nachsehen, ob die Array - Referenzen mit '==' identisch sind. – Logan

+0

Haha, ja, ich nahm an, dass Arrays.equals() während contains() aufgerufen worden wäre, da es als ein Objekt behandelt wird. Meh, ich denke, es ist nicht so implementiert. – StackOverflowAccount

2

Das Problem hierbei ist, dass Arrays nicht Überschreibung Object#equals Methode daher den Ausgang Sie zu empfangen; Sie können stattdessen ArrayList von ArrayLists erstellen, z. Der folgende Code gibt true aus.

ArrayList<Integer> position = new ArrayList<>(Arrays.asList(5, 6)); 
ArrayList<ArrayList<Integer>> test = new ArrayList<>(); 
ArrayList<Integer> y = new ArrayList<>(Arrays.asList(5,6)); 
test.add(y); 
System.out.println(test.contains(position)); 

eine weitere Option wäre, um Ihre aktuelle Lösung zu belassen, wie es ist, aber einen Strom verwenden, um einen Vergleich mit den anderen Arrays innerhalb der Liste auszuführen:

System.out.println(test.stream().anyMatch(e -> Arrays.equals(e,position))); 
0

Arrays können nur mit Arrays verglichen werden .equals().

sollten Sie Arraylist statt:

ArrayList<Integer> position = new ArrayList<Integer>(Arrays.asList(5, 6)); 

ArrayList<ArrayList<Integer>> test = new ArrayList<>(); 
test.add(new ArrayList<>(Arrays.asList(50, 2))) 
test.add(new ArrayList<>(Arrays.asList(0, 7))); 
test.add(new ArrayList<>(Arrays.asList(5, 6))); 
test.add(new ArrayList<>(Arrays.asList(2, 1))); 


System.out.println(test.contains(position)); 
Verwandte Themen