无论使用Comparator如何排序?

时间:2017-06-03 05:17:16

标签: java sorting 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);
}

最终结果如下:

Given Result

但是我想按这样对列表进行排序:

expected result

无论大小写如何都对链接进行排序。我怎么能这样做?

2 个答案:

答案 0 :(得分: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"在字典上比{小于{ {1}}。

答案 1 :(得分:1)

通用解决方案是使用java.text.Collator,这是一个专门的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] ,它不仅可以处理大写/小写,还可以处理变音符号(例如ä和ë)并了解语言环境差异(例如,大多数西方语言将ë与e放在一起,但芬兰将其置于z之后)。

jQuery(document).ready(function($){

// jQuery code is in here

});