2015-04-01 56 views
0

我有一張表,其中前兩位數字是一年,後三位數字是介於0到999之間的一個值,最後2個字符是2個alphaOnly字符。一些示例值:0,0,99001AG,99002FG,54001AG,54050AB,還有一些情況下值只是一個6位的字符串SGP4DC。將會有多個值爲SGP4DC的值。 0是不好的數據,但爲了測試目的,我必須考慮它們。如何創建混合比較器?

特殊情況:由於是兩位數年份,當按降序排序時,從1999年(例如99001A)啓動的排序總是比2000年(例如06001A)排序爲「更大」。特殊處理程序應確保00到56之間的任何項目的排序大於57到99之間的任何項目。

現在我的排序目標是首先按照前兩位數字的順序來處理上述特殊情況。然後用下面的3位數字進行跟蹤。最後只是最後2個字符的字符串排序。最後,用字符串比較不要以2位數字開頭的值。的升序預期排序

實施例將是 60001AG 60002FB 42001AG 42002GD APG4GP APG4GP

再次注意,如果2個前導數字是大於或等於57它代表1957年-1999。如果2位數字小於57,則代表2000-2056。

最後我的代碼。注意我目前在表格中有一些虛假數據,其值爲0.因此,我試圖讓它們比其他所有東西都少。我沒有權力去除0,所以我試圖在他們周圍編碼。 IE 0將始終顯示在上面的排序列表之後。

@Override 
public int compare(String o1, String o2) { 
    if(o1.equals("0") && o2.equals("0")){ 
     return 0; 
    } 
    System.out.println("Comparing " + o1 + " and " + o2); 
    if (o1.length() == 1) { 
     return -1; 
    } 
    if (o2.length() == 1) { 
     return 1; 
    } 

    String o1year = null; 
    String o2year = null; 
    Integer obj1year; 
    Integer obj2year; 

    if (o1.length() >= 2) { 
     o1year = o1.substring(0, 2); 
    } 
    if (o2.length() >= 2) { 
     o2year = o2.substring(0, 2); 
    } 

    if (isInteger(o1year)) { 
     if (isInteger(o2year)) { 

      obj1year = Integer.parseInt(o1year); 
      obj2year = Integer.parseInt(o2year); 

      // handles years 2000 - 2056 being greater than anything from 
      // ##57-##99 
      if (obj1year < 57 && obj2year > 56) { 
       return 1; 
      } 
      if (obj1year == obj2year) { 

       int returnValue = compareIncriment(o1, o2); 
       if(returnValue == 0){ 
       return o1.compareToIgnoreCase(o2); 
       } 
       return returnValue; 

      } 
      if (obj1year > obj2year) { 
       return 1; 
      } else { 
       return -1; 
      } 

     } 
     return 1; 
    } 

    // object 2 starts with a 2 digit year and object 1 didnt 
    if (isInteger(o2year)) { 
     return -1; 
    } 

    // final return 
    return o1.compareToIgnoreCase(o2); 
} 

private int compareIncriment(String o1, String o2) { 
    // TODO Auto-generated method stub 
    int inc1; 
    int inc2; 
    if(isInteger(o1.substring(2, 4))){ 
     inc1 = Integer.parseInt(o1.substring(2, 4)); 
    }else if(isInteger(o1.substring(2, 3))){ 
     inc1 = Integer.parseInt(o1.substring(2, 3)); 
    }else{ 
     inc1 = Integer.parseInt(o1.substring(2, 2)); 
    } 

    if(isInteger(o2.substring(2, 4))){ 
     inc2 = Integer.parseInt(o2.substring(2, 4)); 
    }else if(isInteger(o2.substring(2, 3))){ 
     inc2 = Integer.parseInt(o2.substring(2, 3)); 
    }else{ 
     inc2 = Integer.parseInt(o2.substring(2, 2)); 
    } 

    return inc1 - inc2; 
} 

更新的代碼***

我現在什麼也看不到我的表,我得到一個比較法違反其總承包的錯誤。

+0

真的沒有混合比較器這樣的東西。對象是可以相互比較的,或者它們不是。關鍵是要指定特定類型項目的「自然排序」規則。如果您可以指定明確定義的規則,那麼應該可以實現表達這些規則的算法。 – scottb 2015-04-01 20:21:34

回答

1

您應該爲比較器編寫單元測試以發現錯誤。你還應該更好地考慮你的代碼,因爲你的功能很難理解。首先,將產品代碼分爲「0」情況,年份情況和非年度情況。如果兩個代碼不在同一個類中,則返回相應的結果。

如果它們在同一個類中,則將具體的比較分解爲單獨的函數,甚至是單獨的比較器。具有獨立的比較器使得它們更容易測試;單獨的職能很難證明是公開的。

我通過查看代碼發現了一個bug:對於c.compare("0", "0"),它應返回0時返回-1。除此之外,真的很難說。

+0

表示感謝。在添加一些錯誤處理之後,它會調用Collections.Sort。我發現它拋出以下錯誤。 比較方法違反其總體合同。 – Jeremy 2015-04-10 17:59:38

+0

發現我錯過了一些導致錯誤的不同情況。通過將其進一步分解成單獨的部分,我能夠看到它丟失了哪些情況。 – Jeremy 2015-04-13 15:02:22