original classを定義してsortする。
デフォルトはsorteditemに定義したcompareToでソートされる。
comparatorを切り替えることによりsort順をコントロールできる
public class Outer {
public static void main(String[] args) {
Outer o = new Outer();
SortedItem s = o.new SortedItem("sato",1);
List<SortedItem> sl = new ArrayList();
sl.add(o.new SortedItem("aoyama",3));
sl.add(o.new SortedItem("yamada",2));
sl.add(o.new SortedItem("sato",1));
Collections.sort(sl); //name,ascending
for(SortedItem si : sl) {
System.out.println(si.name + ":" + si.price);
}
System.out.println("---------------------");
Comparator c = o.new DecendingStringComparator();
Collections.sort(sl,c); //name,decending
for(SortedItem si : sl) {
System.out.println(si.name + ":" + si.price);
}
System.out.println("---------------------");
c = o.new DecendingIntComparator();
Collections.sort(sl,c); //price,decending
for(SortedItem si : sl) {
System.out.println(si.name + ":" + si.price);
}
}
class DecendingIntComparator implements Comparator<SortedItem> {
@Override
public int compare(SortedItem s1,SortedItem s2) {
return new Integer(s2.price).compareTo(new Integer(s1.price));
}
}
class DecendingStringComparator implements Comparator<SortedItem> {
@Override
public int compare(SortedItem s1,SortedItem s2) {
return s2.name.compareTo(s1.name);
}
}
class SortedItem implements Comparable<SortedItem> {
String name;
int price;
SortedItem(String name, int price) {
this.name = name;
this.price = price;
}
@Override
public int compareTo(SortedItem s) {
return name.compareTo(s.name);
}
}
}
aoyama:3
sato:1
yamada:2
---------------------
yamada:2
sato:1
aoyama:3
---------------------
aoyama:3
yamada:2
sato:1