2010-09-29 25 views
0

考虑这个类。这是按标题,位置排序并使用比较器排序的正确方法吗?

public class DynamicField implements Comparable<DynamicField> { 
    String title; 
    int position; 
    int order; 

    @Override 
    public int compareTo(DynamicField o) { 
     if(position < o.position) 
      return -1; 
     if(position > o.position) 
      return 1; 

     if(order < o.order) 
      return -1; 
     if(order > o.order) 
      return 1; 

     return title.compareTo(o.title); 

    } 
} 

如果我想按标题,位置和顺序进行排序,compareTo方法是否正确?

+3

回答你的问题的正确方法是使用Junit编写一个简短的测试用例。 compareTo按书面顺序依次排列位置,顺序和标题。 – 2010-09-29 16:28:43

回答

1

不,你做比较。重新排列比较顺序将使其工作:

@Override 
public int compareTo(DynamicField o) { 
    int c = title.compareTo(o.title); 
    if (c != 0) 
     return c; 
    if(position < o.position) 
     return -1; 
    if(position > o.position) 
     return 1; 
    if(order < o.order) 
     return -1; 
    if(order > o.order) 
     return 1; 
    return 0; 
} 
+0

谢谢,我会接受这个答案,因为它是最易读的 – 2010-09-29 16:44:18

+0

@Shervin你也应该考虑质量:-) – 2010-09-30 05:46:50

+0

正确性,例如,避免溢出的可能性。 ;-) – 2010-09-30 05:49:28

1

不行,试试这个代码 不正确的顺序更新

public class DynamicField implements Comparable<DynamicField> { 
     String title; 
     int position; 
     int order; 

     @Override 
     public int compareTo(DynamicField o) { 
      int result = title.compareTo(o.title); 
      if(result != 0) {}    
      else if(position != o.position) 
       result = position-o.position; 
      else if(order != o.order) 
       result = order- o.order; 

      return result; 

     } 
    } 
+0

如果'title.compareTo(o.title)== 0','position o.order'怎么办?你的方法将返回'0'。 – 2010-09-29 16:33:31

+0

@Sheldon L. Cooper谢谢我错过了这个场景更新了代码 – 2010-09-29 16:35:23

0

这实际上是相同的@ org.life.java的答案。不过,你可能会发现这个更美味。

@Override 
public int compareTo() { 
    int result = title.compareTo(o.title); 
    if (result == 0) 
     result = position - o.position; 
    if (result == 0) 
     result = order - o.order; 
    return result; 
} 
+0

如果头寸或订单是负值,该怎么办?然后会发生什么?那么我认为你的头寸和订单的顺序将会逆转 – 2010-09-30 07:27:23

+0

不,这应该会给你和@ Sheldon一样的答案。我可以看到的唯一问题就是这里的溢出,例如,如果位置接近2^31(2到31),o.position接近-2^31。但是,如果位置和顺序值范围在-2^30到2^30之间,那么这就没问题。 – matiasg 2010-10-01 17:25:54