2

我有一个 DataPoint 对象列表。类定义是:

public static class DataPoint
     {
         public Comparable X;
         public Comparable Y;
         public Comparable Z;

         public String text; 

               ...
          }

“list”是 DataPoint 对象的 ArrayList。如何仅根据 X 值对列表进行排序?会在这里使用 Collections.sort(list, compare) 吗?

4

2 回答 2

5

是的,您应该为每个字段创建特定的比较器。例子:

Comparator<DataPoint> compByX = new Comparator<DataPoint>() {
    @Override
    public int compare(DataPoint left, DataPoint right) {
        return left.X.compareTo(right.X);
    }
};
Collections.sort(list, compByX);
于 2012-12-30T19:32:17.683 回答
3

你有两个选择:

如果您想对对象进行自然排序(这将是最常用的),第一个解决方案是有意义的。通常,它是您在需要额外订购时使用比较器时首先使用的那个。

它们的行为方式相同,但Comparable<T>本质上附加到对象,因为它是其默认比较算法。每当涉及排序时,除非您指定另一个排序,否则将使用默认排序。

class DataPoint implements Comparable<DataPoint> {
  @Override
  public int compareTo(DataPoint o) {
    return X.compareTo(o.X);
  }
}

请注意,当您需要比较对象时,通常还需要对它们进行其他操作,因此请注意覆盖hashCode()equals(Object o). 后者用于排序,如文档所述:

当且仅当 e1.compareTo(e2) == 0 对于 C 类的每个 e1 和 e2 具有与 e1.equals(e2) 相同的布尔值时,C 类的自然排序被称为与 equals 一致。.. .强烈建议(尽管不是必需的)自然排序与equals 一致。

这意味着如果您只是比较 X 变量,那么两个相同的不同DataPoint对象X将被认为是相等的compareTo。这可能会导致奇怪的情况。

于 2012-12-30T19:33:44.173 回答