contains()方法用于二维数组的数组列表



我有一个2d数组的数组列表,contains()方法似乎不起作用。

if (visitedBFS.contains(multi2)) 
{    
    frontier.add(multi2);    
    visitedBFS.add(multi2); 
}

已经在数组列表中的2D数组不应该被添加到队列中,但是它会一次又一次地被添加到frontier中。

还有其他方法吗?

你有什么建议吗?

谢谢。

问题是数组不覆盖equals方法,因此它们具有默认实现的行为,即:

150    public boolean equals(Object obj) {
151        return (this == obj);
152    }

这是一个contains调用,用来检查列表中是否包含要搜索的元素。

如果你选择这个:

List<String[][]> l = new ArrayList<>();
l.add(new String[][]{{"one"},{"two"}});
String[][] arr = {{"one"},{"two"}};
System.out.println(l.contains(arr)); //false

输出false,因为两个数组不指向相同的内存位置。


您可以使用Arrays.deepEquals:

创建一个助手方法。
static boolean contains(List<String[][]> l,  String[][] arr){
    for(String[][] array : l){
        if(Arrays.deepEquals(array, arr)){
            return true;
        }
    }
    return false;
}
...
System.out.println(contains(l, arr)); //true

另一种可能是使用一个类来保存你的数组,然后重写equals

class MyArrayHolder {
    private String[][] arr;
    public MyArrayHolder(String[][] arr){
        this.arr = arr;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + Arrays.deepHashCode(arr);
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        MyArrayHolder other = (MyArrayHolder) obj;
        if (!Arrays.deepEquals(arr, other.arr))
            return false;
        return true;
    }   
}
然后使用List<MyArrayHolder>
public static void main(String[] args) throws Exception{
    List<MyArrayHolder> l = new ArrayList<>();
    l.add(new MyArrayHolder(new String[][]{{"one"},{"two"}}));
    String[][] arr = {{"one"},{"two"}};
    System.out.println(l.contains(new MyArrayHolder(arr))); //true
}

让我猜猜看你想要什么:

static int[][] mainTab = new int[][] { { 1, 0, 0, 5 }, { 0, 1, 0, 4 },
        { 1, 2, 1, 7 } };
public static void main(String[] args) {
    System.out.println(contains(new int[] { 1, 0, 0, 5 }));
    System.out.println(contains(new int[] { 7, 7, 7, 5 }));
    System.out.println(contains(new int[] { 1, 2, 1, 77 }));
}
public static boolean contains(int[] tab) {
    for (int i = 0; i < 3; i++) {
        boolean isOkRow = true;
        for (int j = 0; j < 4; j++) {
            if (mainTab[i][j] != tab[j]) {
                isOkRow = false;
            }
        }
        if (isOkRow) {
            return true;
        }
    }
    return false;
}
与输出:

true
false
false

相关内容

  • 没有找到相关文章

最新更新