我想在android應用程序中進行搜索自動完成功能。有一系列商業名稱和列表業務類型,我將它們放入一個數組列表中,根據模糊搜索算法進行評分,然後根據搜索詞的分數對列表進行排序。我希望獲得與企業名稱相同的業務類型首先出現。我包裹業務和BusinessType的情況下,在這個類,因爲它們是得分,添加到列表中,然後排序:排序ArrayList:比較方法違反其總合約
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;
}
}
如果得分相同則它應該不會返回'0'? –
沒有,如果一個商業類型的名稱得分與我需要它放置在商業之前的實際商業的名稱相同。 – maturecheese
如果'o.score - this.score'溢出,您的解決方案仍然可能會中斷。 –