繁体   English   中英

检查 Java 的数组队列中是否存在元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM