2010-09-29 60 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