删除Custom对象的ArrayList中的重复项

use*_*528 3 java sorting algorithm android arraylist

我正在尝试从我的阵列中删除重复的对象.

我的自定义由两个双重组成:x和y.

我想要做的是删除重复((x && y)==(x1 && y1))如果x == x1我想保留具有更高y的对象.

ArrayList<MyObject> list = [x(0),y(0)], [x(0),y(0)], [x(0.5),y(0.5], [x(0.5),y(0.6)], [x(1),y(1)]; 
ArrayList<MyObject> results = [x(0),y(0)], [x(0.5),y(0.6)], [x(1),y(1)]; 
Run Code Online (Sandbox Code Playgroud)

我试图实现equals方法,但我不知道如何使用它:

public boolean equals(Object obj) {
    if (obj == null || !(obj instanceof MyObject)) {
        return false;
    }
    return (this.x == ((MyObject)obj).x);
}
Run Code Online (Sandbox Code Playgroud)

始终使用Collections.sort by x对list进行排序.

谢谢大家.

Sto*_*ica 6

给出MyObject这样的:

class MyObject {
    private final double x;
    private final double y;

    public MyObject(double x, double y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        MyObject myObject = (MyObject) o;

        if (Double.compare(myObject.x, x) != 0) return false;
        if (Double.compare(myObject.y, y) != 0) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result;
        long temp;
        temp = Double.doubleToLongBits(x);
        result = (int) (temp ^ (temp >>> 32));
        temp = Double.doubleToLongBits(y);
        result = 31 * result + (int) (temp ^ (temp >>> 32));
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以实现一个unique仅返回包含唯一元素的列表的方法:

private List<MyObject> unique(List<MyObject> list) {
    List<MyObject> uniqueList = new ArrayList<>();
    Set<MyObject> uniqueSet = new HashSet<>();
    for (MyObject obj : list) {
        if (uniqueSet.add(obj)) {
            uniqueList.add(obj);
        }
    }
    return uniqueList;
}
Run Code Online (Sandbox Code Playgroud)

并进行单元测试以验证其是否有效:

@Test
public void removeDups() {
    List<MyObject> list = Arrays.asList(new MyObject(0, 0), new MyObject(0, 0), new MyObject(0.5, 0.5), new MyObject(0.5, 0.6), new MyObject(1, 1));
    List<MyObject> results = Arrays.asList(new MyObject(0, 0), new MyObject(0.5, 0.5), new MyObject(0.5, 0.6), new MyObject(1, 1));
    assertEquals(results, unique(list));
}
Run Code Online (Sandbox Code Playgroud)

注意:由于使用了哈希映射,因此实现这两者equalshashCode使其工作非常重要.但你总是应该在你的自定义类这样做呢:提供适当equalshashCode实现.顺便说一句,我没有写那些equalshashCode方法.我让我的IDE(IntelliJ)从字段xy类中自动生成它们.