gpt4 book ai didi

java - 排序ArrayList : Comparison method violates its general contract

转载 作者:行者123 更新时间:2023-12-01 18:00:42 24 4
gpt4 key购买 nike

我正在尝试在 Android 应用程序中创建搜索自动完成功能。我将商业名称列表和商业类型列表放入一个数组列表中,根据模糊搜索算法进行评分,然后根据搜索词的分数对列表进行排序。我希望与企业名称得分相同的企业类型首先出现。我将 Business 和 BusinessType 的实例包装在此类中,因为它们被评分,添加到列表,然后排序:

public class SearchMatch<T extends NameMatcher> implements Comparable<SearchMatch> {

public T data;
public int score;

public SearchMatch(T data, int score) {
this.data = data;
this.score = score;
}


@Override
public int compareTo(SearchMatch o) {
if(this.score == o.score && this.data instanceof BusinessType
&& o.data instanceof Business){
return -1;
}
return o.score - this.score;
}
}

...但这不起作用。我得到一条“比较方法违反了其一般契约”。来自 Collections.sort - logcat 中没有其他内容。

我看不出它有什么问题或者它如何违反了传递性(来自其他类似的帖子)。奇怪的是,如果我返回 1 而不是 -1,我不会收到错误,但会得到错误的优先顺序。

谢谢

已解决

public class SearchMatch<T extends NameMatcher> implements      Comparable<SearchMatch> {

public final T data;
public final int score;

public SearchMatch(final T data,final int score) {
this.data = data;
this.score = score;
}


@Override
public int compareTo(SearchMatch o) {
if(this.score == o.score && this.data instanceof BusinessType
&& o.data instanceof Business){
return -1;
}

if(this.score == o.score && this.data instanceof Business
&& o.data instanceof BusinessType){
return 1;
}
return o.score - this.score;
}
}

最佳答案

考虑一下:

假设您有两个具有相同分数的对象 bbt,其中一个是 Business另一个是 BusinessType

compareTo(bt, b) -> -1
compareTo(b, bt) -> 0 // Incorrect! This should be >= 0.

另一个潜在的问题是o.score - this.score没有考虑整数溢出。

也有可能您正在更改score和/或data的值,或者由于同步不正确而导致值不一致。我建议您将这两个字段声明为final。这将使类不可变,并且还将消除同步的需要(至少在这方面)。

(关于您违反的“契约(Contract)”的解释,请参阅其他答案。)

关于java - 排序ArrayList : Comparison method violates its general contract,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41194486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com