【问题标题】:Sorting Map by value [duplicate]按值排序地图[重复]
【发布时间】:2012-12-04 07:21:33
【问题描述】:

可能重复:
TreeMap sort by value

请看下面的代码

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);

    }
}

如您所见,地图包含 2 种类型的数据。现在我需要按值对它进行排序,如果可能的话,最好按降序排序,否则没问题,正常排序。但是,你知道像下面这样的事情是不可能的

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

那么,我该如何排序呢?请帮忙。

【问题讨论】:

  • 另外,Map&lt;String, int&gt; 是不可能的,你需要Map&lt;String, Integer&gt;
  • 我不认为HashMap可以排序。您可以按照@jlordo 的建议查看TreeMap

标签: java arrays sorting map hashmap


【解决方案1】:
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;
    }

【讨论】:

    【解决方案2】:

    如果您想按键排序,请使用 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-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 2013-01-06
      • 2016-08-13
      • 2019-07-21
      相关资源
      最近更新 更多