相关疑难解决方法(0)

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

我看到很多关于这个的问题,并试图解决这个问题,但经过一个小时的谷歌搜索和大量的试验和错误,我仍然无法解决它.我希望你们中的一些人能够解决问题.

这就是我得到的:

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)
    ...
Run Code Online (Sandbox Code Playgroud)

这是我的比较器:

@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()) {
        return -1;
    } else {
        if (card1.getSet() == card2.getSet()) {
            if (card1.getRarity() < card2.getRarity()) {
                return 1;
            } else {
                if (card1.getId() == card2.getId()) { …
Run Code Online (Sandbox Code Playgroud)

java migration compare comparator java-7

68
推荐指数
4
解决办法
11万
查看次数

当捕获实际上没有捕获任何东西

由于最近存储在数据库中的数据不好,导致程序崩溃.这让我感到困惑,因为我觉得我有一个阻止这一点.

以下代码的目的是比较员工徽章编号并对其进行排序.如果出现错误,请返回-1并且士兵开启 - 请勿停止,因为数千个徽章编号中的一个错误:

public int compare(Employee t, Employee t1) {
    Integer returnValue = -1;
    try {
        Integer tb = Integer.parseInt(t.getBadgeNumber());
        Integer t1b = Integer.parseInt(t1.getBadgeNumber());
        returnValue = tb.compareTo(t1b);
    } catch (Exception e) {
        returnValue = -1;//useless statement, I know.
    }
    return returnValue;
}
Run Code Online (Sandbox Code Playgroud)

当坏徽章编号被击中时(在这种情况下为t),我得到了一个"java.lang.IllegalArgumentException:比较方法违反了它的一般合同!" 错误而不是在catch中返回-1.

关于这里的捕获,我不明白什么?

完整的堆栈跟踪:

16-May-2018 14:28:53.496 SEVERE [http-nio-8084-exec-601] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [RequestServlet] in context with path [/AppearanceRequest] threw exception
 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) …
Run Code Online (Sandbox Code Playgroud)

java exception try-catch comparator

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

比较方法违反了其总合同!仅限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万
查看次数

使用 Spring Rest Template 时,比较方法违反了其一般契约

我们的一个应用程序正在通过 Spring Rest 模板调用另一个应用程序。

HttpEntity<Object> httpEntity = new HttpEntity<>(null);
restTemplate.exchange(URL, HttpMethod.GET, httpEntity,String.class)
Run Code Online (Sandbox Code Playgroud)

我们尚未为请求显式设置任何标头。我们遇到以下异常:

Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeHi(TimSort.java:895)
    at java.util.TimSort.mergeAt(TimSort.java:512)
    at java.util.TimSort.mergeCollapse(TimSort.java:437)
    at java.util.TimSort.sort(TimSort.java:241)
    at java.util.Arrays.sort(Arrays.java:1512)
    at java.util.ArrayList.sort(ArrayList.java:1454)
    at java.util.Collections.sort(Collections.java:175)
    at org.springframework.http.MediaType.sortBySpecificity(MediaType.java:441)
    at org.springframework.web.client.RestTemplate$AcceptHeaderRequestCallback.doWithRequest(RestTemplate.java:691)
    at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:743)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:567)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:530)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:448)
Run Code Online (Sandbox Code Playgroud)

我们使用的Java版本是:1.8.0_45和Spring:4.1.6

如果有人能提供帮助那就太好了。如果需要,我很乐意提供更多详细信息。

期待中感谢。

java spring spring-mvc spring-rest

6
推荐指数
1
解决办法
1148
查看次数

TimSort什么时候抱怨破坏的比较器?

Java 7 更改了排序算法,使其抛出一个

java.lang.IllegalArgumentException:"比较方法违反了它的一般合同!"

在某些情况下,使用的比较器是有缺陷的.是否可以判断比较器中的哪种错误导致这种情况?在我的实验中,如果x!= x无关紧要,如果x <y和y <z但z <x也没关系,但是如果x = y且y = z但是x <z对于某些值确实很重要x,y,z.这通常是这样吗?

(如果对此有一般规则,可能更容易在比较器中查找错误.但当然最好修复所有错误.:-))

特别是,以下两个比较器没有让TimSort抱怨:

    final Random rnd = new Random(52);

    Comparator<Integer> brokenButNoProblem1 = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            if (o1 < o2) {
                return Compare.LESSER;
            } else if (o1 > o2) {
                return Compare.GREATER;
            }
            return rnd.nextBoolean() ? Compare.LESSER : Compare.GREATER;
        }
    };

    Comparator<Integer> brokenButNoProblem2 = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            if (o1 == o2) …
Run Code Online (Sandbox Code Playgroud)

java timsort java-7

5
推荐指数
1
解决办法
1421
查看次数

使用可比较的比较不同的变量

我熟悉使用Comparable接口的标准比较,虽然今天我想要比较几个不同的变量时遇到一些麻烦.

我基本上想要实现一个compareTo方法,只有在以下if语句为真时才产生结果-1:

if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ)
Run Code Online (Sandbox Code Playgroud)

虽然,我不确定这是否可能使用类似的,或者我只是不像它看起来那么熟悉.因为当我尝试这种方法时

public int compareTo(IsoSprite o) {
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ){
        return -1;
    }else if(o.maxX < minX && o.maxY < minY && o.minZ > maxZ){
        return 1;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到错误"比较方法违反了其总合同!" .我想澄清一点,我不需要帮助理解这个错误意味着什么,因为我已经阅读了几个关于它的问题.虽然,我仍然不能把我的想法放在这个特定的问题上,因为我读过的其他问题的解决方案是微不足道的.

我真的很感激这种比较的一些帮助,它将是一个救生员.任何输入也很受欢迎.

编辑:经过测试后,我得到的东西几乎可以工作(并非在所有情况下),但我无法弄清楚原因:

public int compareTo(IsoSprite o) {
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ) {
        return -1;
    } …
Run Code Online (Sandbox Code Playgroud)

java comparison comparable comparator libgdx

5
推荐指数
1
解决办法
82
查看次数

另一种违反合同的比较方法

我有这门课:

class Column implements Comparable<Column> {
  private final float startX;
  private final float endX;

  public Column(float startX, float endX) {
    this.startX = startX;
    this.endX = endX;
  }

  public boolean isSameColumn(Column c) {
    return c.startX <= this.startX && this.startX < c.endX || this.startX <= c.startX && c.startX < this.endX;
  }

  @Override
  public int hashCode() {
    return Objects.hash(startX, endX);
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == null) return false;
    if (getClass() != obj.getClass()) return false;
    final Column other = …
Run Code Online (Sandbox Code Playgroud)

java exception comparator java-8 java-stream

5
推荐指数
1
解决办法
185
查看次数

比较java.util.Date时,比较方法违反了它的一般契约

我收到以下错误:

Caused by: javax.faces.el.EvaluationException: java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101) [jboss-jsf-api_2.1_spec-2.1.28.SP1-redhat-1.jar:2.1.28.SP1-redhat-1]
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:101) [jsf-impl-2.1.28.redhat-10.jar:2.1.28.redhat-10]
    at javax.faces.component.UICommand.broadcast(UICommand.java:315) [jboss-jsf-api_2.1_spec-2.1.28.SP1-redhat-1.jar:2.1.28.SP1-redhat-1]
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:786) [jboss-jsf-api_2.1_spec-2.1.28.SP1-redhat-1.jar:2.1.28.SP1-redhat-1]
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1251) [jboss-jsf-api_2.1_spec-2.1.28.SP1-redhat-1.jar:2.1.28.SP1-redhat-1]
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) [jsf-impl-2.1.28.redhat-10.jar:2.1.28.redhat-10]
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.28.redhat-10.jar:2.1.28.redhat-10]
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.28.redhat-10.jar:2.1.28.redhat-10]
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.1.28.SP1-redhat-1.jar:2.1.28.SP1-redhat-1]
    ... 29 more
Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeHi(TimSort.java:899) [rt.jar:1.8.0_65]
    at java.util.TimSort.mergeAt(TimSort.java:516) [rt.jar:1.8.0_65]
    at java.util.TimSort.mergeForceCollapse(TimSort.java:457) [rt.jar:1.8.0_65]
    at java.util.TimSort.sort(TimSort.java:254) [rt.jar:1.8.0_65]
    at java.util.Arrays.sort(Arrays.java:1512) [rt.jar:1.8.0_65]
    at java.util.ArrayList.sort(ArrayList.java:1454) [rt.jar:1.8.0_65]
    at java.util.Collections.sort(Collections.java:175) [rt.jar:1.8.0_65]
Run Code Online (Sandbox Code Playgroud)

下面是我的比较方法代码.vo1.getAttribute()返回java.util.DateObject.

    @Override
    public int compare(DateComparableVO …
Run Code Online (Sandbox Code Playgroud)

java date comparator illegalargumentexception

5
推荐指数
2
解决办法
3743
查看次数

排序集合时了解比较方法

我有以下代码来对具有label属性的Items集合进行排序:

Collections.sort(myList, new Comparator<ListItem>() {
            @Override
            public int compare(ListItem lhs, ListItem rhs) {
                Crashlytics.log(Log.DEBUG, TAG, "lhs.getLabel(): " + lhs.getLabel() + " | rhs.getLabel(): " + rhs.getLabel());
                if (lhs.getLabel() == null || rhs.getLabel() == null) {
                    return 0;
                }
                return lhs.getLabel().compareTo(rhs.getLabel());
            }
        });
Run Code Online (Sandbox Code Playgroud)

我有一些崩溃报告与以下stacktrace:

Caused by java.lang.IllegalArgumentException: Comparison method violates its general contract!
       at java.util.TimSort.mergeLo(TimSort.java:777)
       at java.util.TimSort.mergeAt(TimSort.java:514)
       at java.util.TimSort.mergeForceCollapse(TimSort.java:457)
       at java.util.TimSort.sort(TimSort.java:254)
       at java.util.Arrays.sort(Arrays.java:1498)
       at java.util.ArrayList.sort(ArrayList.java:1470)
       at java.util.Collections.sort(Collections.java:201)
       at uk.co.aquanetix.activities.MyActivity.onCreate(MyActivity.java:59)
       at android.app.Activity.performCreate(Activity.java:7183)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
       at android.app.ActivityThread.-wrap11(Unknown Source)
       at …
Run Code Online (Sandbox Code Playgroud)

java sorting comparison comparator

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

Android - 比较方法违反了其总合同

我已经看到了有关此异常的其他问题,但我的比较方法非常简单,我无法弄清楚它有什么问题,我无法使用我拥有的任何Android设备重现它.

我从我的Android应用程序的一些用户那里得到了这个例外,其中大多数似乎是在GS3或GS4这样的新设备上,我猜测它运行Java 7变种的合并排序.

这是我的比较方法:

            Collections.sort(collectionOfThings, new Comparator<Thing>()
            {
                public int compare(Thing lhs, Thing rhs) 
                {
                    //getDist() returns a Double with a capital D...perhaps that has something to do with it?
                    if(lhs.getDist() < rhs.getDist())
                    {
                        return -1;
                    }
                    if(lhs.getDist() == rhs.getDist())
                    {
                        return 0;
                    }

                    return 1;
                };
            });
Run Code Online (Sandbox Code Playgroud)

这是例外:

Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeLo(TimSort.java:743)
    at java.util.TimSort.mergeAt(TimSort.java:479)
    at java.util.TimSort.mergeCollapse(TimSort.java:404)
    at java.util.TimSort.sort(TimSort.java:210)
    at java.util.TimSort.sort(TimSort.java:169)
    at java.util.Arrays.sort(Arrays.java:2038)
    at java.util.Collections.sort(Collections.java:1891)
Run Code Online (Sandbox Code Playgroud)

似乎仅限于Android 4.0+.任何帮助是极大的赞赏.

java collections mergesort android

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