您可以使用
我有一个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