相关疑难解决方法(0)

如何简化null安全的compareTo()实现?

我正在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)

java comparison null refactoring compareto

147
推荐指数
7
解决办法
14万
查看次数

比较方法违反了其总合同!仅限Java 7

我知道这已经有一段时间了,并且检查了我以前得到的所有答案,但是这个仍然不起作用.

对象'船员'代表有船员和其他物品的船员.比较应该通过比较'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)

compareto java-7

34
推荐指数
3
解决办法
4万
查看次数

Collections.sort()throws比较方法违反了它的一般合同!例外

我正在尝试对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)

java sorting collections exception

20
推荐指数
1
解决办法
1万
查看次数

"比较方法违反其一般合同"仅在某些情况下被抛出

首先,我知道许多其他线程都描述了这个问题.但是我无法找到并回答这个问题,为什么不总是抛出这个错误?

让我来描述一下我的意思.我写了一些示例代码来说明这一点:

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)

java comparator

4
推荐指数
1
解决办法
3513
查看次数

比较方法抛出异常:比较方法违反了其一般合同

可能重复:
为什么我的比较方法抛出异常 - 比较方法违反了它的一般合同!

我有这个代码:

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 exception contract comparator

3
推荐指数
1
解决办法
1万
查看次数