2012-12-30 38 views
2

我有一个DataPoint对象的列表。该类的定义是:如何对其某个字段上的类对象列表进行排序?

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

     public String text; 

       ... 
      } 

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

回答

3

你有两个选择:

第一种方法是有意义的如果你想给你的对象(这将是最常用的)的自然排序。通常,这是您在需要额外排序时使用比较器时首先使用的那个。

它们的行为方式都是一样的,但Comparable<T>固有地附着在对象上,因为它是它的默认比较算法。每当涉及到排序时,除非您指定另一个,否则将使用默认排序。

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

记住,当你需要比较的对象通常需要还包括其他业务上他们,所以采取覆盖hashCode()equals(Object o)的照顾。后者用于按文档状态排序:

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

这意味着,如果你只是比X变量,然后用相同X两个不同DataPoint对象将被视为相对于compareTo相等。这可能会导致奇怪的情况。

+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); 
+0

你的意思是'left.X.compareTo(right.X);'或'left.Y.compareTo(right.Y);'? –

+0

@PeterLawrey哎呀,谢谢。 –

相关问题