我正在compareTo()为一个简单的类实现方法(为了能够使用Collections.sort()和Java平台提供的其他好东西):
public class Metadata implements Comparable<Metadata> {
private String name;
private String value;
// Imagine basic constructor and accessors here
// Irrelevant parts omitted
}
Run Code Online (Sandbox Code Playgroud)
我希望这些对象的自然顺序为:1)按名称排序; 2)如果名称相同则按值排序; 两种比较都应该不区分大小写.对于这两个字段,空值完全可以接受,因此compareTo在这些情况下不得中断.
脑海中出现的解决方案与以下几行相似(我在这里使用"保护条款",而其他人可能更喜欢单个返回点,但这不是重点):
// primarily by name, secondarily by value; null-safe; case-insensitive
public int compareTo(Metadata other) {
if (this.name == null && other.name != null){
return -1;
}
else if (this.name != null && other.name == null){
return 1;
}
else if (this.name != null && …Run Code Online (Sandbox Code Playgroud) 我知道这已经有一段时间了,并且检查了我以前得到的所有答案,但是这个仍然不起作用.
对象'船员'代表有船员和其他物品的船员.比较应该通过比较'assigned_rank',一个int值,如果这两个实例中的值相等,那么'is_trainer',一个布尔值,应该有所不同.
只要它运行java <7,这种方法就很有效.但是从Java 7开始我就得到了这个:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeLo(ComparableTimSort.java:714)
at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:451)
at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:376)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:182)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at java.util.Collections.sort(Collections.java:155)
at dormas_flightlog.Query.getCrew(Query.java:714)
Run Code Online (Sandbox Code Playgroud)
这是源代码,其中一些有潜在危险的部分已经被评论过,但它仍然不起作用:
public class crew implements Serializable, Comparable<crew> {
private static final long serialVersionUID = 36L;
private int flightID = 0;
private int assigned_rank = 25;
private boolean is_trainer = false;
...
@Override
public int compareTo(crew him) {
int myRank = this.getAssigned_rank();
int hisRank = him.assigned_rank;
if (this == him) {
return 0; …Run Code Online (Sandbox Code Playgroud) 我正在尝试对List <>对象进行排序,并且抛出此异常(仅适用于大型列表)
排序代码:
List<FinalSentence> sentenceList = finalRepresentation.getSentences();
Collections.sort(sentenceList); // <=== EXCEPTION THROWN HERE!!!
Run Code Online (Sandbox Code Playgroud)
FinalSentence类头:
public class FinalSentence implements Comparable<FinalSentence>{...}
Run Code Online (Sandbox Code Playgroud)
compareTo()实现:
@Override
public int compareTo(FinalSentence o) {
if (this == o) {
return 0;
}
if (this.score > o.score) {
return 1;
}
if (this.score < o.score) {
return -1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是例外:
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeHi(Unknown Source)
at java.util.ComparableTimSort.mergeAt(Unknown Source)
at java.util.ComparableTimSort.mergeCollapse(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source) …Run Code Online (Sandbox Code Playgroud) 首先,我知道许多其他线程都描述了这个问题.但是我无法找到并回答这个问题,为什么不总是抛出这个错误?
让我来描述一下我的意思.我写了一些示例代码来说明这一点:
public class Mushroom {
public int size;
public Mushroom(int size) {
this.size = size;
}
@Override
public boolean equals(Object obj) {
//this is intentionally false - read in description
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
DSA
public class MushroomComparator implements Comparator<Mushroom> {
@Override
public int compare(Mushroom o1, Mushroom o2) {
// here is the code which breaks the contract
if (o1.size < o2.size){
return 1;
}else if(o1.size >o2.size){
return -1;
}
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
最后测试比较:
public class ComparisonTest { …Run Code Online (Sandbox Code Playgroud) 我有这个代码:
class TimeComparatorTipo0 implements Comparator {
@Override
public int compare(Object a, Object b) {
String Time1 = ((DataImportedTipo0) a).ora;
Long VolTot1 = Long.parseLong(((DataImportedTipo0) a).volume_totale);
String Time2 = ((DataImportedTipo0) b).ora;
Long VolTot2 = Long.parseLong(((DataImportedTipo0) b).volume_totale);
if (Time1.equals(Time2))
{
if ( VolTot1.compareTo(VolTot2) > 0)
return 1;
else
return -1;
}
else
return Time1.compareTo(Time2);
}
};
Run Code Online (Sandbox Code Playgroud)
有时会抛出此异常:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:868)
at java.util.TimSort.mergeAt(TimSort.java:485)
at java.util.TimSort.mergeForceCollapse(TimSort.java:426)
at java.util.TimSort.sort(TimSort.java:223)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at java.util.Collections.sort(Collections.java:217)
at …Run Code Online (Sandbox Code Playgroud) java ×4
comparator ×2
compareto ×2
exception ×2
collections ×1
comparison ×1
contract ×1
java-7 ×1
null ×1
refactoring ×1
sorting ×1