【问题标题】:How to check if an object exists in a LinkedList in java?java - 如何检查对象是否存在于Java的LinkedList中?
【发布时间】:2018-05-07 15:43:57
【问题描述】:

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

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

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

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

所以我想避免添加这个。

如何验证对象已经存在?有没有可以使用的内置功能? contains() 没有做到这一点。

【问题讨论】:

  • 是否允许使用 Java 8+?
  • 如果您的列表包含一个包含两个整数的类,并且如果该类覆盖了 equals 和 hashCode,反映了这些整数是什么,那么只需在列表上调用 contains(...)。如果你走这条路,那么最好让类不可变。
  • 考虑使用Set 并使用正确的equalshashcode 方法为您的整数对创建一个类。
  • 使用 Set<Point>> 代替:没有重复的 .equals 好,add 然后返回 false。

标签: java linked-list contains


【解决方案1】:

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

你最好创建一个Coordinate 类,它将保存两个值:

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 实现会更好,它可以防止坐标集中出现重复,因此我们不需要手动检查。

【讨论】:

  • 缩写是不好的做法,不鼓励使用,除非它们被普遍接受,例如Utils。因此,Coordinate 是首选。
  • 警告:如果您要在 equals 和 hashCode 中使用 x 和 y 字段,那么它们应该是不可变的(根据我对 OP 问题的评论)。
  • @chsdk 我们可以使用StreamSet 来缩短它。
  • @HovercraftFullOfEels 我只是尝试为示例目的生成一个快速类,是的,最好将其定义为不可变的。无论如何,谢谢你的提示:)
  • @ShubhenduPramanik 是的,使用Stream 是另一个不错的选择,对于Set 点来说是的,我正要指出这一点。
【解决方案2】:

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

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

【讨论】:

  • 我建议做 chsdk 发布的内容。
【解决方案3】:

您可以使用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:

是的

注意:您可以使用ArrayList,因为您也可以保留序列。

【讨论】:

    【解决方案4】:

    如果你真的想用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);
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2020-03-31
      相关资源
      最近更新 更多