Tag: 比较器

Comparable和Comparator关于null的合同

Comparable合约指定e.compareTo(null)必须抛出NullPointerException 。 从API : 请注意, null不是任何类的实例,即使e.equals(null)返回false , e.compareTo(null)应抛出NullPointerException 。 另一方面, Comparator API在比较null时没有提到什么需要发生。 考虑下面一个采用Comparable的generics方法的尝试,并返回一个Comparator ,它将null作为最小元素。 static <T extends Comparable<? super T>> Comparator<T> nullComparableComparator() { return new Comparator<T>() { @Override public int compare(T el1, T el2) { return el1 == null ? -1 : el2 == null ? +1 : el1.compareTo(el2); } }; } 这使我们能够做到以下几点: List<Integer> numbers […]

为什么比较器要实现Serializable?

Java新手 在Android应用程序上工作时学习它。 我正在实现一个比较器来对文件列表进行sorting,而android文档则说比较器应该实现Serializable: build议比较器实现Serializable。 这是这里的Serializable接口。 我只想对文件列表进行sorting。 我为什么要实现这个function,甚至是为什么它应该为比较器?

具有空值的比较器

我们有一些代码根据它们的坐标之间的距离对地址列表进行sorting。 这是通过与自定义比较器的collections.sort完成的。 然而,不时有一个没有坐标的地址出现在导致NullPointerException的列表中。 我最初的想法是解决这个问题,让比较器返回0作为至less有一个坐标为空的地址的距离。 我担心这可能会导致列表中“有效”元素的腐败。 所以在比较器中返回空值数据的“0”值,还是有一个更清晰的方法来解决这个问题。

Java 8比较器types推断非常困惑

我一直在查看Collections.sort和list.sort之间的区别,特别是关于使用Comparator静态方法以及在lambdaexpression式中是否需要参数types。 在我们开始之前,我知道我可以使用方法引用,例如Song::getTitle来克服我的问题,但是我的查询并不是我想要解决的问题,而是我想要的答案,即为什么Java编译器要处理就这样。 这些是我的发现。 假设我们有一个Songtypes的ArrayList ,添加了一些歌曲,有3个标准的获取方法: ArrayList<Song> playlist1 = new ArrayList<Song>(); //add some new Song objects playlist.addSong( new Song("Only Girl (In The World)", 235, "Rhianna") ); playlist.addSong( new Song("Thinking of Me", 206, "Olly Murs") ); playlist.addSong( new Song("Raise Your Glass", 202,"P!nk") ); 这是对这两种types的sorting方法的调用,没有问题: Collections.sort(playlist1, Comparator.comparing(p1 -> p1.getTitle())); playlist1.sort( Comparator.comparing(p1 -> p1.getTitle())); 一旦我开始链接thenComparing ,会发生以下情况: Collections.sort(playlist1, Comparator.comparing(p1 -> […]

Java TreeMap比较器

我需要一个TreeMap的比较器。 我应该在我的TreeMap的构造函数中匿名写这个吗? 我怎么能写我的比较。 目前,Java不喜欢我的代码(我可以匿名吗?): SortedMap<String, Double> myMap = new TreeMap<String, Double>(new Comparator<Entry<String, Double>>() { public int compare(Entry<String, Double> o1, Entry<String, Double> o2) { return o1.getValue().compareTo(o2.getValue()); } }); 我可以匿名做上述吗? 我还能怎么做? 我想通过Value not the Key来sortingmyMap

Java中的自然sorting顺序string比较 – 是内置的?

我想要一些保留自然sorting顺序1的string比较函数。 有没有像Java这样的东西? 在String类中我找不到任何东西, Comparator类只知道两个实现。 我可以推出自己的(这不是一个很难的问题),但是我不想重新发明轮子。 在我的具体情况下,我有我想要sorting的软件版本string。 所以我想把“1.2.10.5”视为大于“1.2.9.1”。 1按照“自然”的sorting顺序,我的意思是比较string与人类比较的方式,而不是“ascii-betical”的sorting顺序,只对程序员有意义。 换句话说,“image9.jpg”小于“image10.jpg”,“album1set2page9photo1.jpg”小于“album1set2page10photo5.jpg”,“1.2.9.1”小于“1.2.10.5”

Java错误:比较方法违反了它的一般合同

我看到很多关于这个的问题,并试图解决这个问题,但经过一个小时的谷歌search和大量的试验和错误,我仍然无法修复。 我希望你们中的一些人能够解决问题。 这是我得到的: java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:835) at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:453) at java.util.ComparableTimSort.mergeForceCollapse(ComparableTimSort.java:392) at java.util.ComparableTimSort.sort(ComparableTimSort.java:191) at java.util.ComparableTimSort.sort(ComparableTimSort.java:146) at java.util.Arrays.sort(Arrays.java:472) at java.util.Collections.sort(Collections.java:155) … 这是我的比较: @Override public int compareTo(Object o) { if(this == o){ return 0; } CollectionItem item = (CollectionItem) o; Card card1 = CardCache.getInstance().getCard(cardId); Card card2 = CardCache.getInstance().getCard(item.getCardId()); if (card1.getSet() < card2.getSet()) […]