【问题标题】:Sort ArrayList of custom object and reorder in Java对自定义对象的 ArrayList 进行排序并在 Java 中重新排序
【发布时间】:2014-12-24 09:18:06
【问题描述】:

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

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

我想做的是:

  1. 从数组中删除重复:只需删除重复的对象,如果对象具有相同的 x,则保留更高的 y。
  2. 根据 x 值重新排序列表(x 是时间,y 是一个因素)

我尝试使用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);  
    }
});

【问题讨论】:

  • 什么是自定义对象?

标签: java algorithm sorting arraylist


【解决方案1】:

使用不同的比较器对列表进行两次排序将不起作用。您需要在同一个比较器中同时比较 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 删除重复项将起作用。

【讨论】:

  • The sorting implemented by Collections.sort() is not stable 是什么意思?
  • 其实请忽略。 Collections.sort() 确实进行了稳定的排序,但在这里无关紧要。
  • 比你我试试
【解决方案2】:

要为您的自定义类获取独特元素,您只需将所有元素添加到 HashSet 之类的内容中即可。要使用它,您需要覆盖 Object#hashCode() 方法,让它返回相同的 hashCode() 值 x 和 y 的 MyObject 实例。不要忘记覆盖Object#equals()。

您可以参考here 了解有关覆盖hashCode() 和equals() 的更多信息。

【讨论】:

  • 泰国你我试试
【解决方案3】:

您可以在 MyObject 类中实现Comparable&lt;MyObject&gt;,然后使用TreeSet&lt;MyObject&gt;,结果您已经对唯一值进行了排序。

【讨论】:

    【解决方案4】:

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

    • 您将 MyObject 类型的对象存储在列表中
    • 像使用 x 字段一样对它们进行排序
    • 遍历列表并检查与先前元素的重复项(在 MyObject 类中实现 equals 和 hashCode 方法)并删除“y”字段中值较小的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 2014-11-09
      • 2017-12-12
      • 2011-02-16
      相关资源
      最近更新 更多