そのIDが選択されたアイテムのIDと等しい場合、アイテムを配列の先頭に移動する必要があるアイテムの配列をソートしようとしています(これも配列に属しています)。残りの要素の並べ替え順序は、特定の場所からの距離です。
次のように実装されたカスタム コンパレータで恐ろしいjava.lang.IllegalArgumentException: Comparison method violates its general contract!
例外が発生しています。
Location location = ...; // may be null
Item selectedItem = ...; // may be null or an element of the array to be sorted
private final Comparator<Item> comparator = new Comparator<Item>() {
@Override
public int compare(Item p1, Item p2) {
// if p1 is the currently selected item, bring p1 to the top
// if p2 is the currently selected item, bring p2 to the top
// else sort p1 and p2 by their distance from location
if (selectedItem != null) {
if (selectedItem.getId() == p1.getId()) { //id's are int and unique in the array
return -1;
} else if (selectedItem.getId() == p2.getId()) {
return 1;
}
}
if (location != null) { //location is an Android Location class instance
Float distance1 = location.distanceTo(p1.getLocation());
Float distance2 = location.distanceTo(p2.getLocation());
return distance1.compareTo(distance2);
} else {
return 0;
}
}
};
問題を再現するための正確なシーケンスはありませんが、これまでのエラーの観察はすべて、selectedItem
とlocation
が null でない場合に発生します (両方とも null の可能性があります)。
ヒントはありますか?
ありがとう