RankedObject
実装するクラスを書くときComparable<RankedObject>
:
public static class RankedObj implements Comparable<RankedObj> {
int i;
public RankedObj(int i) {
this.i=i;
}
@Override
public String toString() {
return "RankedObj [i=" + i + "]";
}
@Override
public int compareTo(RankedObj o) {
if(this.i == 3) { // '3' will always be the smallest item
return -1;
}
return this.i-o.i;
}
RankedObjectのリストを「全体的に昇順で、同時に数字3
が常にsmallest
一つになるように」したい。テスト中に、元のリストの順序が実際に結果に影響し、場合によっては結果が正しくないことがわかりました。すなわち:
//----CASE 1----
List<RankedObj> list = new ArrayList<>();
list.add(new RankedObj(11));
list.add(new RankedObj(1));
list.add(new RankedObj(12));
list.add(new RankedObj(3));
list.add(new RankedObj(8));
Collections.sort(list);
System.out.println(list);
//output (as I intend)
[RankedObj [i=3], RankedObj [i=1], RankedObj [i=8], RankedObj [i=11], RankedObj [i=12]]
//----CASE 2----
List<RankedObj> list = new ArrayList<>();
list.add(new RankedObj(11));
list.add(new RankedObj(12));
list.add(new RankedObj(3));
list.add(new RankedObj(8));
list.add(new RankedObj(1));
Collections.sort(list);
System.out.println(list);
//output (not what my Comparable intends)
[RankedObj [i=1], RankedObj [i=3], RankedObj [i=8], RankedObj [i=11], RankedObj [i=12]]
誰かが私の理由を教えてもらえますか? また、「3」が最小の項目でありながら、全体的に昇順でリストを作成する目的をどのように実現できますか? どうもありがとう!
PSComparator
コードが のコードと同じであるを使用した私のテストによるとComparable
、結果は同じです。
Collections.sort(list, new Comparator<RankedObj>() {
@Override
public int compare(RankedObj o1, RankedObj o2) {
if(o1.i == 3) {
return -1;
}
return o1.i-o2.i;
}
});