Mapの値(value)の中身でソート
自身で作成したクラスのインスタンスの中身でソートさせたい場合おおよそ以下のようにする。
- Map.EntryセットをListに突っ込む。
- ListをCollectionを使ってソート。ここで自身で作成したクラスのインスタンスの値を使って比較する。
MyClass.java
$ cat MyClass.java public class MyClass { private String name; private String value; public MyClass(String n, String v) { this.name = n; this.value = v; } public void setName(String n) { this.name = n; } public String getName() { return name; } public void setValue(String v) { this.value = v; } public String getValue() { return value; } }
MySort.java
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class MySort { public static void main(String[] args) { // LinkedHashMap 生成 Map<String, MyClass> map = new LinkedHashMap<String, MyClass>(); map.put("a", new MyClass("aa", "0004")); map.put("b", new MyClass("bb", "0003")); map.put("c", new MyClass("cc", "0002")); map.put("d", new MyClass("dd", "0001")); // generate ArrayList for sorting List<Map.Entry<String,MyClass>> entries = new ArrayList<Map.Entry<String,MyClass>>(map.entrySet()); // find it out later Entry target = entries.get(2); // sort by value of MyClass using Collection Collections.sort(entries, new Comparator<Map.Entry<String,MyClass>>() { @Override public int compare( Entry<String,MyClass> entry1, Entry<String,MyClass> entry2) { return entry1.getValue().getValue().compareTo(entry2.getValue().getValue()); } }); // result for (Entry<String,MyClass> s : entries) { System.out.println("Key = " + s.getKey() + " [MyClassName = " + s.getValue().getName() + " MyClassValue = " + .getValue().getValue() + "]"); } System.out.println("index = " + entries.indexOf(target)); } }
確認
$ ls MyClass.java MySort.java $ javac MySort.java $ java MySort Key = d [MyClassName = dd MyClassValue = 0001] Key = c [MyClassName = cc MyClassValue = 0002] Key = b [MyClassName = bb MyClassValue = 0003] Key = a [MyClassName = aa MyClassValue = 0004] index = 1
参考にしたのは以下のサイト。