2014-03-26 48 views
1

我有一個List<String> theList 它有以下類型的值如何排序含delimted多個字段列表<String>「|〜」

"2011-05-05|~JKED" 
"2011-05-06|~ABC" 
"2011-05-01|~XYZ" 
"2011-05-01|~WWX" 

的作爲,你可以想有在theList兩個「場」。

我想在第一個字段,然後在第二個領域,如我得到排序操作

"2011-05-01|~WWX" 
"2011-05-01|~XYZ" 
"2011-05-05|~JKED" 
"2011-05-06|~ABC" 

後,下面的輸出。如果我拿這兩個領域在一個單獨的列表和做Collections.sort(field1List)Collections.sort(field2List)我得到的排序theList期望的輸出。

但是,我想知道,如何使用Collections.sort(theList, new Comparator(){})能夠梳理上述theList,從而獲得所需的輸出。如果它是不可能通過比較(來解決),請提出了一些方法,它可能看起來像sortMultiFieldList(List<String> theList)

這是一個很長的故事,爲什麼我必須有在一個單一的列表兩個或多個字段。

讓我知道你是否需要更多的澄清。

+0

東西是錯誤的(或不有道理) 1)名單不能有兩個字段。 2)假設你有一個列表中的字段和第二個列表中的其他字段。我想你需要他們相關的。他們不以任何方式。 – celerno

+2

@celerno:如果它是一箇中間有管道的巨大字符串,那麼本質上它有兩個「字段」。 – Makoto

+0

好的,好吧。現在編輯它,它是有道理的。 – celerno

回答

3

這非常簡單。您需要爲此編寫自定義Comparator,並強制執行其比較邏輯,以便按照您希望的方式來處理兩個單獨的「字段」。

這裏的動機是這些字段在日期部分以及按字母順序排列的字符串部分按字母順序進行比較。如果你發現日期比較沒有給你準確的結果(它可能不會;但我不確定它會不會有效的情況),然後將它轉換爲Date,然後將它比較-線。

Collections.sort(entries, new Comparator<String>() { 
    @Override 
    public int compare(String left, String right) { 
     String[] leftFragments = left.split("[|]"); 
     String[] rightFragments = right.split("[|]"); 
     if(leftFragments[0].compareTo(rightFragments[0]) == 0) { 
      return leftFragments[1].compareTo(rightFragments[1]); 
     } else { 
      return leftFragments[0].compareTo(rightFragments[0]); 
     } 
    } 
}); 
+0

+1謝謝,我試圖簡化這個問題。實際上,我的一些列表中有4個「字段」,它並不總是隻有2個字段。此解決方案是否適用於超過2個字段的列表? – Watt

+0

你將不得不設計它來做到這一點。現在,'String []'將包含所有四個元素(如果您有三個'|'字符)。它確實需要統一,因爲這使得你至少有兩個假設;如果你想假設你有更多的東西,你也需要在這裏包含它。 – Makoto