【问题标题】:contains() method for arraylist of 2D arrays [closed]二维数组数组列表的 contains() 方法[关闭]
【发布时间】:2014-03-22 20:39:08
【问题描述】:

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

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

已经在Array List中的二维数组不应该加入队列,而是一次又一次地加入到frontier中。

还有其他方法吗?

你有什么建议吗?

谢谢。

【问题讨论】:

  • 你到底想做什么?你能分享你的代码和它表现出的(错误的)行为吗?
  • 已经在Array List中的二维数组不应该加入队列,而是一次又一次的加入frontier。 if(visitdBFS.contains(multi2)) { frontier.add(multi2);访问BFS.add(multi2); }
  • @gray_malkin:如果你想在 8 个谜题中进行广度优先搜索,那么如果不包括这些信息,你认为我们到底怎么能读懂你的想法您的问题中有正确的代码吗?

标签: java arraylist multidimensional-array


【解决方案1】:

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

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

这是包含调用以查看列表是否包含您搜索的元素。

如果你拿这个:

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&lt;MyArrayHolder&gt;

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
}

【讨论】:

  • 这可能有用。谢谢。
【解决方案2】:

让我猜猜,你想要什么:

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

【讨论】:

  • 没有。我正在尝试检查整个二维数组是否存在于数组列表中。不仅仅是一个元素。 @IWillTryToCodeIt
  • @gray_malkin 我编辑了我的帖子
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多