【问题标题】:Java: Remove Object from List using equals overrideJava:使用等于覆盖从列表中删除对象
【发布时间】:2019-11-18 17:05:06
【问题描述】:

注意:我必须使用 Java 8
我正在尝试从 Java ArrayList 中删除和添加对象,如下所示:

private List<Point> points;

[...]

void addPoint(int x, int y) {
    Point newpoint = new Point(x, y);
    if (!points.contains(newpoint)) {
        points.add(new Point(x, y));
    } else {
        System.out.println("Error! Point already exists!");
    }
}

void removePoint(int x, int y) {
    Point newpoint = new Point(x, y);
    if (points.removeIf(n -> n.equals(newpoint))) {
        System.out.println("Point was removed!");
    } else {
        System.out.println("Error! Point does not exist!");
    }
}

Point 是一个简单的对象,具有 xy intequals 方法,如果提供的 Point 对象具有相同的坐标,则返回 true

如您所见,我正在检查对象是否存在然后添加它,在removePoint 中我使用removeIf(我认为这是次优的)从列表中删除该点。 那么如何通过覆盖equals 方法来正确解决这个问题并且removeIf 真的不是最理想的呢?

【问题讨论】:

  • removeIf 是执行删除的最有效方法,如果您预计会出现多次。如果您希望最多有 1 个,请使用 remove
  • “和一个 equals 方法”我希望你也覆盖了 hashCode
  • 您真的需要points 成为List 还是可以使用Set 来代替?对于这个用例,HashSet 看起来很整洁。
  • 您确定,您不是在寻找订购的Set 吗?读取这些数据的查询到底是什么?
  • 如果你需要维护元素的插入顺序,那么你应该使用LinkedHashSet

标签: java arraylist java-8


【解决方案1】:

你可以重写 EqualsAndHashCode 方法,或者向你的 Point.class 添加一个方法来比较给定的坐标,比如

public boolean sameCoordinates(Point point){
  return this.x-point.getX()==0 && this.y-point.getY()==0
}

我在之前的项目中使用了 removeIf,但我们用流代替了它。一个原因是,removeIf 适用于给定的列表,而 Java 适用于引用调用。这迫使我们在调用 removeIf 之前复制适用于该列表的每个方法中的列表,否则我们将通过程序对其进行更改。

另一个原因是,HashSet 上的 removeIf 会更改 Set,这意味着它会更改 HashCode。 Java 在任何地方都可以安全地保存该集合的哈希值。如果你想稍后使用这个集合,你会得到一个错误,因为 Java 不知道新的哈希值只知道旧的。我们花了一些时间来找到这个错误的根源。

这里是一个如何使用流的小例子

 public static void main(String[] args){
    List<Integer> numberList = new ArrayList<>();
    numberList.add(1);
    numberList.add(2);
    numberList.add(3);
    numberList.add(4);
    numberList.add(5);
    numberList.add(6);

    List<Integer> evenNumbers = numberList.stream().filter(number -> number % 2 == 0).collect(Collectors.toList());
    System.out.println(evenNumbers);

总而言之,我使用流。我希望这对你有所帮助。

【讨论】:

    猜你喜欢
    • 2016-11-14
    • 1970-01-01
    • 2018-05-02
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    相关资源
    最近更新 更多