如何使用比较器进行排序而不考虑大小写?
How to sort regardless of case with Comparator?
我正在使用 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);
}
最后的结果是这样的:
但我想像这样对列表进行排序:
链接排序不分大小写。我该怎么做?
它按字典顺序比较字符串,所以大写字母在小写字母之前。你可以做的是使用内置 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
,不仅可以处理uppercase/lowercase,还可以处理变音符号(例如ä和ë)并且了解地区差异(例如,大多数西方语言将 ë 与 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]
我正在使用 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);
}
最后的结果是这样的:
但我想像这样对列表进行排序:
链接排序不分大小写。我该怎么做?
它按字典顺序比较字符串,所以大写字母在小写字母之前。你可以做的是使用内置 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
,不仅可以处理uppercase/lowercase,还可以处理变音符号(例如ä和ë)并且了解地区差异(例如,大多数西方语言将 ë 与 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]