java オブジェクトのリストを任意の順番で並べ替える#
自作のオブジェクトMyObject
のリストがあり、それを任意の順番で並べ替えたいとします。
MyObject.java
public class MyObject {
String field;
MyObject(String field){
this.field = field;
}
String getField(){ return field; }
}
Comparator<MyObject>
を実装した並び順定義のクラスMySort
を作成します。
order()
の処理で、MyObject
のフィールド値から並び替え優先度を示す数値を算出し、それを利用してcompare()
を実装します。
MySort.java
public class MySort implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
return order(o1) - order(o2);
}
public int order(MyObject o) {
List<String> linkOrder = new ArrayList<>(Arrays.asList(
"apple",
"lemon",
"peach"
));
int index = linkOrder.indexOf(o.getField());
// 定義されていない路線IDの場合は最後にする
return index != -1 ? index : linkOrder.size();
}
}
stream().sorted((o1, o2) -> new MySort().compare(o1, o2))
としてやればMySort
で定義した順番で並べ替えられます。
MySort
のorder()
の処理を変えることで複数フィールドを考慮した並び順も定義できます。
main.java
public static void main(String[] args){
List<MyObject> myObjects = new ArrayList<>(Arrays.asList(
new MyObject("lemon"),
new MyObject("cake"),
new MyObject("apple")
));
myObjects = myObjects.stream()
.sorted((o1, o2) -> new MySort().compare(o1, o2))
.collect(Collectors.toList());
for(MyObject myObject : myObjects){
System.out.println(myObject.getField());
}
// 結果:
// apple
// lemon
// cake
}