2014-02-10 58 views
0

我想按自定義順序對列表進行排序,我已經按照stackOverflow鏈接進行了排序。 自定義順序必須如下:「ST,SIT,JDC」已在customOrder中使用數組列表完成。 並且來自數據庫的數據必須按照上述順序顯示在列表中,但問題在於,只有在數據庫中的數據與該列表完全匹配時纔可以使用,就像我擁有「ST」或「坐」,那麼它就可以完成這項工作。 但我從數據庫中獲取的數據是這樣的:如何根據自定義訂單對java列表進行排序

ST1,ST2,ST3,SIT1,SIT2,JDC發佈,JDC停止,JDC 10

這個代碼不工作對於我的數據,結果沒有錯誤,但它根本不排序數據。

這裏是代碼:

List<Environment> environments = environmentDAO.getAll(); 
final List<String> customOrder = Arrays.asList("ST", "SIT", "JDC"); 

    Collections.sort(environments, new Comparator<Environment>() { 

     @Override 
     public int compare(final Environment o1, final Environment o2) { 

      Integer firstValue = Integer.valueOf(customOrder.indexOf(o1.getAcronym())); 
      Integer secondValue = Integer.valueOf(customOrder.indexOf(o2.getAcronym())); 

      int comparedTo = firstValue.compareTo(secondValue); 

      return comparedTo; 
     } 
    }); 
+1

你的解釋似乎很不明確。提供樣本數據以及您希望樣本數據在排序後的樣子。 –

+0

**你是什麼**自定義排序順序?請發佈預期結果。 **只要您提供正確的「Comporator」,任何**'集合'都可以用'Collections.sort()'排序。 –

+0

對我來說沒關係。什麼不工作?它拋出異常嗎?訂單是否被顛倒? – NeplatnyUdaj

回答

1

的問題是,你不要在customOrder列表定義了所有的可能性。

List.indexOf將返回-1未發現在你的情況下,它的一切,所以沒有東西分類

所以你需要例如假設customOrder僅僅是一個前綴列表元素。那是你要的嗎? 在這種情況下,你需要找到的第一個匹配的指數,並跟蹤案件的餘都比較字符串也有相同的前綴:

@Override 
    public int compare(final Environment o1, final Environment o2) { 
     int order1=-1; 
     int order2=-1; 
     String remainder1=""; 
     String remainder2=""; 
     for (String prefix: customOrder){ 
      if (o1.getAcronym().startsWith(prefix)){ 
       order1=customOrder.indexOf(prefix); 
       remainder1=o1.getAcronym().substring(prefix.length()); 
      } 
      if (o2.getAcronym().startsWith(prefix)){ 
       order2=customOrder.indexOf(prefix); 
       remainder2=o2.getAcronym().substring(prefix.length()); 
      } 
     } 
     if (order1==order2){ 
      return remainder1.compareTo(remainder2); 
     } 
     else{ 
      return order1-order2; 
     } 
    } 

但會有一些邊緣情況下,像重疊的前綴等不管怎樣我試過這段代碼,它可以處理你的數據。

+0

,但我不知道該怎麼做? – user261002

+0

你試過我的代碼嗎? – NeplatnyUdaj

+0

我剛剛嘗試過這段代碼,它的運行非常好。非常感謝 :-) – user261002

相關問題