[英]check if an element exists in queue of array in Java
我在 Java 中有一个 arrays 队列。 检查队列中是否已存在数组的最简单方法是什么?
Queue<Integer[]> q = new LinkedList<>();
if(!q.contains(new Integer[]{r,c})) {
q.add(new Integer[]{r, c});
}
I know what I am checking for is an object and even if an array with same values as r and c already exists in the queue, it will be considered as a different object and returns false.
蛮力方法是使用Arrays.toString(arr)
将数组转换为字符串并遍历队列并检查该值是否存在。
我正在寻找任何其他有效的方法来做同样的事情。
您应该创建一个子类并将其用于您的队列,而不是 Integer[] 队列。
public class MyInts {
public int[] myInts;
public int[] getInts() {
return myInts;
}
public boolean equals(MyInts ints) {
if (!myInts.length == ints.myInts.length) return false;
int i = 0;
while (myInts[i] == ints.myInts[i] && i < myInts.length) {
i++;
}
return i == myInts.length;
}
}
您可以做的是为您的 object 编写一个包装器。 我在这里使用record
,但常规的 class 也可以。 记录需要覆盖equals
使用Arrays.equals()
进行比较。 当打印 object 时,我还覆盖了toString
以显示数组。
record MyInt(int[] val) {
@Override
public int hashCode() {
return Arrays.hashCode(val);
}
@Override
public boolean equals(Object ob) {
if (!(ob instanceof MyInt)) {
return false;
}
MyInt myOb = (MyInt)ob;
return Arrays.equals(val, myOb.val);
}
@Override
public String toString() {
return Arrays.toString(val);
}
}
定义队列和一些数据
Queue<MyInt> queue =
new LinkedList<>();
List<MyInt> data = List.of(
new MyInt(new int[] {1,2}),
new MyInt(new int[] {2,3}),
new MyInt(new int[] {3,4}),
new MyInt(new int[] {4,5}),
new MyInt(new int[] {1,2}),
new MyInt(new int[] {2,3}),
new MyInt(new int[] {3,4}),
new MyInt(new int[] {5,6}));
按照您的问题添加数据。
for (MyInt mi : data) {
if(!queue.contains(mi)) {
queue.add(mi);
}
}
queue.forEach(System.out::println);
印刷
[1, 2]
[2, 3]
[3, 4]
[4, 5]
[5, 6]
一个更有效的解决方案(因为值是散列的)是使用一个集合,它本质上也不允许重复。 不利的一面是集合不允许随机访问它们的值。
Set<MyInt> set = new HashSet<>();
for (MyInt mi : data) {
set.add(mi);
}
set.forEach(System.out::println);
印刷
[1, 2]
[2, 3]
[3, 4]
[4, 5]
[5, 6]
要使上述方法起作用, equals()
和hashCode()
都必须被覆盖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.