2

重複の可能性:
TreeMap 値による並べ替え

次のコードを見てください

import java.util.HashMap;
import java.util.Map;

public class Mapper
{
    Map mMap;

    public Mapper()
    {
        mMap = new HashMap();
        mMap.put("A",1);
        mMap.put("B",2);
        mMap.put("C",3);
        mMap.put("D",4);
        mMap.put("E",5);
        mMap.put("F",6);

    }
}

ご覧のとおり、Map には 2 種類のデータが含まれています。ここで、値で並べ替える必要があります。可能であれば降順で並べ替えることができます。それ以外の場合は問題なく、通常の並べ替えです。しかし、あなたは次のようなことは不可能であることを知っています

Map<String, int> treeMap = new TreeMap<String, int>(mMap);

では、どうすればこれをソートできますか?助けてください。

4

2 に答える 2

2
Map<String, Integer> mMap = new HashMap<String, Integer>();
        mMap.put("A",1);
        mMap.put("B",2);
        mMap.put("C",3);
        mMap.put("D",4);
        mMap.put("E",5);
        mMap.put("F",6);


private static Map sortByComparator(Map unsortMap) {

        List list = new LinkedList(unsortMap.entrySet());

        // sort list based on comparator
        Collections.sort(list, new Comparator() {
            public int compare(Object o1, Object o2) {
                return ((Comparable) ((Map.Entry) (o1)).getValue())
                                       .compareTo(((Map.Entry) (o2)).getValue());
            }
        });


        Map sortedMap = new LinkedHashMap();
        for (Iterator it = list.iterator(); it.hasNext();) {
            Map.Entry entry = (Map.Entry) it.next();
            sortedMap.put(entry.getKey(), entry.getValue());
        }
        return sortedMap;
    }
于 2012-12-17T07:42:50.263 に答える
0

キーでソートする場合は、TreeMap を使用します。

マップを値で並べ替えたい場合は、値で並べ替えられたキーのリストを作成します。

対応する値を比較してキーをソートするには、 Comparator が必要です。

public static <K, V extends Comparable<? super V>> List<K> getKeysSortedByValue(Map<K, V> map) {
    final int size = map.size();
    final List<Map.Entry<K, V>> list = new ArrayList<Map.Entry<K, V>>(size);
    list.addAll(map.entrySet());
    final ValueComparator<V> cmp = new ValueComparator<V>();
    Collections.sort(list, cmp);
    final List<K> keys = new ArrayList<K>(size);
    for (int i = 0; i < size; i++) {
        keys.set(i, list.get(i).getKey());
    }
    return keys;
}

private static final class ValueComparator<V extends Comparable<? super V>>
                                     implements Comparator<Map.Entry<?, V>> {
    public int compare(Map.Entry<?, V> o1, Map.Entry<?, V> o2) {
        return o1.getValue().compareTo(o2.getValue());
    }
}
于 2012-12-17T07:47:25.727 に答える