对自定义对象的ArrayList进行排序并在Java中重新排序

时间:2014-12-24 09:18:06

标签: java algorithm sorting arraylist

我有一个CustomObject的ArrayList,我的对象只是由两个值x和y

组成
MyObject = (double)x && (double)y 

我想做的是:

  1. 从数组中删除重复:只需删除重复的对象,如果对象具有相同的x,则保留较高的y。
  2. 根据x值重新排序列表(x表示时间,y是因子)
  3. 我尝试使用Collections.sort对我的数组进行重新排序,并使用一个集来删除重复但没有任何效果。

    Collections.sort(listPoints, new Comparator<MyObject>(){
        @Override
        public int compare(MyObject lhs, MyObject rhs) {
            return Double.compare(lhs.y, rhs.y);  
        }
    });
    
    Collections.sort(listPoints, new Comparator< MyObject >(){
        @Override
        public int compare(MyObject lhs, MyObject rhs) {
            return Double.compare(lhs.x, rhs.x);  
        }
    });
    

4 个答案:

答案 0 :(得分:2)

使用不同的比较器对列表进行两次排序将不起作用。您需要在同一比较器中比较x和y。

public int compare(MyObject lhs, MyObject rhs) {
    int result = Double.compare(lhs.y, rhs.y);
    if (result != 0) return result;
    return Double.compare(lhs.x, rhs.x);
}

如果MyObject正确实现了equals()和hashCode()方法,则使用set删除重复项将起作用。

答案 1 :(得分:0)

要获取自定义类的唯一元素,您只需将所有元素添加到HashSet之类的内容即可。要使用此功能,您需要覆盖Object#hashCode()方法,以便返回hashCode() x y实例的MyObjectObject#equals()。不要忘记覆盖hashCode()

有关覆盖equals()和{{1}}的更多信息,请参阅here

答案 2 :(得分:0)

您可以在MyObject类中实现Comparable<MyObject>,然后使用TreeSet<MyObject>,因为您已经对唯一值进行了排序。

答案 3 :(得分:0)

要删除重复项并保留排序顺序,我建议如下:

  • 将MyObject类型的对象存储在List
  • 按照x field
  • 的方式对它们进行排序
  • 遍历列表并检查前面元素的重复项(在MyObject类中实现equals和hashCode方法)并在'y'字段中删除值较小的值。