如何使用比较器进行排序?
问题描述:
我使用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);
}
最后的结果是这样的:
但我想对列表进行排序是这样的:
Wher不管情况如何,链接都会被排序。我怎样才能做到这一点?
答
它按字典顺序比较字符串,所以大写字母出现在小写字母之前。你可以做的是使用内置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"
来。
答
通用解决方案是使用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]
'getResource'返回一个字符串吗? – Li357
@AndrewLi是的,它返回美国广播公司,www.google.com,Z.等 – uma