我有一个DataPoint对象列表。类定义是:
public static class DataPoint
{
public Comparable X;
public Comparable Y;
public Comparable Z;
public String text;
...
}
“list”是DataPoint对象的ArrayList。如何仅对X值排序列表?会在这里使用Collections.sort(列表,比较器)吗?
答案 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)
您有两种选择:
DataPoint
班级Comparable<DataPoint>
Comparator<DataPoint>
的自定义比较器,然后使用Collections.sort
如果您想对对象进行自然排序(这将是最常用的对象),第一个解决方案是有意义的。通常它是您在使用比较器时首先使用的那个,当您需要额外的订单时。
它们的行为方式相同,但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
相等。这可能会导致奇怪的情况。