compareメソッドのOverrideで「どっちか昇順だっけ?」って、よくやってしまう
昇順(1,2,3,4,...)にソート
修正:同じ値の時は0を返すべきとの指摘を受けました。ありがとうございます。ifでやるのではなく、Double.compare(Double v1, Double v2)を使用するようにする
注意点
Overrideするcompareメソッドでは、int型を返す。Double型を基準にソートする場合、return v1 - v2;
ができないreturn (int)(v1-v2);
も小数点以下が切り捨てされるので、正確にソートされない
Hoge.java
package hoge;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Main {
public static void main(String... args) {
ArrayList<Hoge> hogeList = new ArrayList<>();
hogeList.add(new Hoge());
hogeList.add(new Hoge());
hogeList.add(new Hoge());
System.out.println("Before");
for (Hoge hoge : hogeList) {
System.out.print(hoge + ",");
}
Collections.sort(hogeList, new HogeComp());
System.out.println("\nAfter");
for (Hoge hoge : hogeList) {
System.out.print(hoge + ",");
}
}
private static final class Hoge {
private final Double value;
private Hoge() {
this.value = (int)(Math.random() * 1000) / 100.0;
}
@Override
public String toString() {
return this.value.toString();
}
}
private static final class HogeComp implements Comparator<Hoge> {
@Override
public int compare(Hoge o1, Hoge o2) {
return Double.compare(o1.value, o2.value);
}
}
}
結果
Before
2.84,3.08,1.07,
After
1.07,2.84,3.08,
降順(5,4,3,2,...)
- 昇順でソートして、Collections.reverse(list)