2017-06-03 92 views
-1

我使用Comparator接口,使用下面的代碼片段按升序排序對象:如何使用比較器進行排序?

final List<LinkModelSpi> documentLinks = this.documentLinksModelSpi.getDocumentLinks(); 

//Add This method for Sorting Document Link View Same Order. Now The application display same links order 
// in catalogue administration edit drug window 
if (Checks.checkNotNullAndNonEmpty(documentLinks)) { 
    if (this.documentLinksModelSpi.getDocumentLinks().iterator().next() instanceof DocumentLinkModelSpi) { 
    Collections.sort(documentLinks, (Comparator<? super LinkModelSpi>) new Comparator<DocumentLinkModelImpl>() { 
     @Override 
     public int compare(DocumentLinkModelImpl o1, DocumentLinkModelImpl o2) { 
     return o1.getResource().compareTo(o2.getResource()); 
     } 
    }); 
    } else { 
    Collections.sort(documentLinks, (Comparator<? super LinkModelSpi>) new Comparator<LinkModelImpl>() { 
     @Override 
     public int compare(LinkModelImpl o1, LinkModelImpl o2) { 
     return o1.getResource().compareTo(o2.getResource()); 
     } 
    }); 
    } 
} 

//Collections.reverse(documentLinks); 
for (final LinkModelSpi documentLinkModelSpi : documentLinks) { 
    //noinspection unchecked 
    ((DtoPresentationModelSpi<?, MDTO>) documentLinkModelSpi).addPropertyChangeListener(this); 
} 

最後的結果是這樣的:

Given Result

但我想對列表進行排序是這樣的:

expected result

Wher不管情況如何,鏈接都會被排序。我怎樣才能做到這一點?

+1

'getResource'返回一個字符串嗎? – Li357

+0

@AndrewLi是的,它返回美國廣播公司,www.google.com,Z.等 – uma

回答

2

它按字典順序比較字符串,所以大寫字母出現在小寫字母之前。你可以做的是使用內置String#compareToIgnoreCase忽略大小寫:

return o1.getResource().compareToIgnoreCase(o2.getResource()); 

,或者你可以通過在比較小寫兩個操作數與String#toLowerCase

return o1.getResource().toLowerCase().compareTo(o2.getResource().toLowerCase()); 

這樣一來,就沒有資金來歪曲結果,並且只有在排序時將字母考慮在內。


注:排序字符串字典順序意味着"www.google10.com"將前"www.google9.com"因爲比較字符串的字符至字符和"1"排在最後不到"9"來。

+0

謝謝你..我認爲錯誤已解決,但我會進一步檢查和評論。 – uma

+0

我可以使用o1.getResource()。compareToIgnoreCase(o2.getResource());這個 ?我用這個,但排序不正確發生。 – uma

+1

@uma它應該完全一樣。 – Li357

1

通用解決方案是使用java.text.Collator,這是一個專門Comparator這不僅可以處理大/小寫,但也可以處理變音符號(如A和E),並知道語言環境的差異(例如,大多數西方語言把ë與e,但芬蘭把它放在z之後)。

import java.text.Collator; 
import java.util.*; 

public class Example { 
    public static void main(String[] args) { 
     Collator en_US = Collator.getInstance(Locale.US); 
     Collator fi_FI = Collator.getInstance(new Locale("fi", "FI")); 

     // Optional configuration; read the Javadoc for more information 
//  en_US.setStrength(Collator.PRIMARY); 
//  en_US.setDecomposition(Collator.FULL_DECOMPOSITION); 

     List l = new ArrayList(Arrays.asList("Azz", "ämm", "aaa")); 
     Collections.sort(l, en_US); 
     System.out.printf("en_US: %s\n", l); 
     Collections.sort(l, fi_FI); 
     System.out.printf("fi_FI: %s\n", l); 
    } 
} 

// Output: 
// en_US: [aaa, ämm, Azz] 
// fi_FI: [aaa, Azz, ämm] 
相關問題