■正拳突きのHP:プログラムチップス(java)複数キーでのソート
作成日:2009/02/03
作成環境:windows XP JDK1.6 eclipse4.4
※下の方にセッターゲッター対応版もあります。
1.自作Comparatorのコンストラクタにソートキーの配列を渡し、ソートキーの順番通りにcompareToをしていく。
2.compareToの結果が0以外なら結果を返す。0なら次のソートキーで比較。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
public class SomeKeySort {
public static void main(String[] args) {
ArrayList<HashMap<String, Comparable>> list = new ArrayList<HashMap<String,Comparable>>();
HashMap<String, Comparable> map = null;
map = new HashMap<String, Comparable>();
map.put("name", "John");
map.put("age", "33");
list.add(map);
map = new HashMap<String, Comparable>();
map.put("name", "John");
map.put("age", "29");
list.add(map);
map = new HashMap<String, Comparable>();
map.put("name", "John");
map.put("age", "18");
list.add(map);
map = new HashMap<String, Comparable>();
map.put("name", "Billy");
map.put("age", "33");
list.add(map);
map = new HashMap<String, Comparable>();
map.put("name", "Billy");
map.put("age", "29");
list.add(map);
map = new HashMap<String, Comparable>();
map.put("name", "Billy");
map.put("age", "18");
list.add(map);
map = new HashMap<String, Comparable>();
map.put("name", "Perry");
map.put("age", "33");
list.add(map);
map = new HashMap<String, Comparable>();
map.put("name", "Perry");
map.put("age", "29");
list.add(map);
map = new HashMap<String, Comparable>();
map.put("name", "Perry");
map.put("age", "18");
list.add(map);
String[] sortKeys = {"name", "age"};
Collections.sort(list, new Comp(sortKeys));
System.out.println(list);
Collections.reverse(list);
System.out.println(list);
sortKeys[0] = "age";
sortKeys[1] = "name";
Collections.sort(list, new Comp(sortKeys));
System.out.println(list);
Collections.reverse(list);
System.out.println(list);
}
}
class Comp implements Comparator<HashMap<String, Comparable>> {
public Comp(String[] sortKeys) {
this.sortKeys = sortKeys;
}
String[] sortKeys;
@Override
public int compare(HashMap<String, Comparable> o1, HashMap<String, Comparable> o2) {
for (String key : sortKeys) {
Comparable c1 = o1.get(key);
Comparable c2 = o2.get(key);
int c = c1.compareTo(c2);
if (c != 0) {
return c;
}
}
return 0;
}
}
■ハッシュマップだけじゃ寂しいので、セッターゲッターにも対応させてみた。
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
public class SomeKeySortBean {
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<Object>();
HashMap<String, String> map = null;
myBean mybean = null;
map = new HashMap<String, String>();
map.put("name", "John");
map.put("age", "33");
list.add(map);
map = new HashMap<String, String>();
map.put("name", "John");
map.put("age", "29");
list.add(map);
map = new HashMap<String, String>();
map.put("name", "John");
map.put("age", "18");
list.add(map);
map = new HashMap<String, String>();
map.put("name", "Billy");
map.put("age", "33");
list.add(map);
map = new HashMap<String, String>();
map.put("name", "Billy");
map.put("age", "29");
list.add(map);
map = new HashMap<String, String>();
map.put("name", "Billy");
map.put("age", "18");
list.add(map);
map = new HashMap<String, String>();
map.put("name", "Perry");
map.put("age", "33");
list.add(map);
map = new HashMap<String, String>();
map.put("name", "Perry");
map.put("age", "29");
list.add(map);
map = new HashMap<String, String>();
map.put("name", "Perry");
map.put("age", "18");
list.add(map);
mybean = new myBean("HIDEYOSHI", "28");
list.add(mybean);
mybean = new myBean("HIDEYOSHI", "00");
list.add(mybean);
mybean = new myBean("HIDEYOSHI", "88");
list.add(mybean);
mybean = new myBean("arayama", "28");
list.add(mybean);
mybean = new myBean("arayama", "00");
list.add(mybean);
mybean = new myBean("arayama", "88");
list.add(mybean);
String[] sortKeys = {"name", "age"};
Collections.sort(list, new CompBean(sortKeys));
System.out.println(list);
Collections.reverse(list);
System.out.println(list);
sortKeys[0] = "age";
sortKeys[1] = "name";
Collections.sort(list, new CompBean(sortKeys));
System.out.println(list);
Collections.reverse(list);
System.out.println(list);
}
}
class CompBean implements Comparator<Object> {
public CompBean(String[] sortKeys) {
this.sortKeys = sortKeys;
}
String[] sortKeys;
@Override
public int compare(Object o1, Object o2) {
for (String key : sortKeys) {
Comparable ret1 = (Comparable)getValue(key, o1);
Comparable ret2 = (Comparable)getValue(key, o2);
int c = ret1.compareTo(ret2);
if (c != 0) {
return c;
}
}
return 0;
}
private Object getValue(String key, Object o) {
if (o instanceof Map) {
return ((Map)o).get(key);
}
try {
PropertyDescriptor pd = new PropertyDescriptor(key, o.getClass());
Method rm = pd.getReadMethod();
return rm.invoke(o, null);
} catch (Exception e1) {
// エラーがでたらランタイム投げてしまえ
throw new RuntimeException(e1);
}
}
}
class myBean {
String age;
String name;
public myBean(String name, String age) {
setName(name);
setAge(age);
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "{age="+age+", name="+name+"}";
}
}
TOPに戻る