如何使用比较器进行排序而不考虑大小写?

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]