読者です 読者をやめる 読者になる 読者になる

Mapの値(value)の中身でソート

自身で作成したクラスのインスタンスの中身でソートさせたい場合おおよそ以下のようにする。

  1. Map.EntryセットをListに突っ込む。
  2. 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

参考にしたのは以下のサイト。

http://papiroidsensei.com/memo/java_map_sort.html