如何在其中一个字段上对类对象列表进行排序?

时间:2012-12-30 19:28:30

标签: java class sorting comparator

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

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

         public String text; 

               ...
          }

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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与c1的每个e1和e2的e1.equals(e2)具有相同的布尔值时,C类的自然排序被认为与equals一致。 。... 强烈建议(尽管不要求)自然排序与平等一致。

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