如何检查java中的LinkedList中是否存在对象?

How to check if an object exists in a LinkedList in java?

一个LinkedList包含一组Integer[]。列表中的每个 Integer[] 都有 2 个数字。 链表示例:

Integer[]{1,2}, Integer[]{2,3}.....

在向这个 LinkedList 添加另一个 Integer[] 之前,我想检查是否已经存在具有相同数据的另一个 Integer[]

例如:要添加的对象 = Integer[] {2,3}。但这已经存在于 LinkedList 中。

所以我想避免添加这个。

如何验证对象已经存在?是否有可以使用的内置功能? contains() 没成功。

好吧,你可以用愚蠢的方式来做:

boolean exists = false;
for (Integer[] integers : list) {  // list being the LinkedList
    if (Arrays.equals(integers, value)) {
        exists = true;
        break;
    }
}
if (!exists) {
    list.add(value);
}

我认为如果要处理坐标,最好使用特定的 class,因为 Integer[] 仅对两个数字无用,并且会导致 contains() 和其他一些问题List 方法也像 .sort()

您最好创建一个 Coordinate class,它将包含两个值:

public class Coordinate{
    private int x;
    private int y;

    //getters and setters, constructor
    @Override
    public boolean equals(Object o) {
        if (o == this) return true;
        if (!(o instanceof Coord)) {
            return false;
        }
        Coordinate coord = (Coordinate) o;
        return coord.x == x &&
                coord.y == y;
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + x;
        result = 31 * result + y;
        return result;
    }
}

那么你可以使用:

LinkedList<Coordinate>

注:

请注意,这里使用 Set 实现会更好,它会防止坐标集中出现重复,因此我们不需要手动检查。

您可以使用 StreamSet 来解决您的问题,如下所示:

 List<Set<Integer>> list = new LinkedList<>();
    list.add(Stream.of(1, 2).collect(Collectors.toSet()));

    Set<Integer> s1 = new HashSet<>();
    s1.add(1);
    s1.add(2);

    System.out.println(list.contains(s1));

    Set<Integer> s2 = new HashSet<>();
    s2.add(1);
    s2.add(4);
    System.out.println(list.contains(s2));

O/P:

正确

错误

N.B: 您可以使用 ArrayList 因为您也保留了序列。

如果你真的很想用 contains() 来做(或者出于任何原因别无选择),你可以这样实现:

    final Integer[] newPair = {2, 3};
    final boolean exists = values.contains(new Object()
    {
        // note that List.contains() javadoc explicitly specifies that 
        // newPair is used as the receiver not the argument for equals()
        @Override
        public final boolean equals(final Object listElement)
        {
            final Integer[] otherPair = (Integer[]) listElement;
            return Arrays.equals(newPair, otherPair);
        }
    });