■正拳突きの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に戻る