2017-06-03 87 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] 
相关问题