【问题标题】:sort a map from its keys ordered by values from another list根据另一个列表中的值排序的键对映射进行排序
【发布时间】:2015-10-05 07:36:49
【问题描述】:

我有一个包含键字符串和值字符串以及字符串列表的地图。我想根据列表中存在的值的顺序使用键对 Map 进行排序。

package da.fa;


public class MapSorted {

public static void main(String[] args) {

    List<String> efgh = new ArrayList<String>();
    efgh.add("ccc");
    efgh.add("aaa");
    efgh.add("ddd");
    efgh.add("aaa");

    Map<String, String> abcd = new HashMap<String, String>();
    abcd.put("aaa", "1111");
    abcd.put("bbb", "1111");
    abcd.put("ccc", "1111");
    abcd.put("ddd", "1111");
    abcd.put("eee", "1111");
}
}

在此,abcd 应按 efgh 所具有的值的顺序排序。

【问题讨论】:

标签: java


【解决方案1】:

HashMap 是不可排序的,请使用 TreeMap 代替:

    public static void main(String[] args) {

        // define the needed keys
        List<String> neededKeys = new ArrayList<String>();
        neededKeys.add("ccc");
        neededKeys.add("aaa");
        neededKeys.add("ddd");
        neededKeys.add("aaa");

        // build a simple hashmap (unsorted)
        Map<String, String> unsortedMap = new HashMap<String, String>();
        unsortedMap.put("aaa", "1111");
        unsortedMap.put("bbb", "1111");
        unsortedMap.put("ccc", "1111");
        unsortedMap.put("ddd", "1111");
        unsortedMap.put("eee", "1111");

        // build a sorted TreeMap and pass only the necessary objects
        TreeMap<String, String> sortedMap=new TreeMap<String, String>();
        for(String key:unsortedMap.keySet()){
            // copy needed keys ONLY to a new sorted map
            if (neededKeys.contains(key)){
                sortedMap.put(key, unsortedMap.get(key));
            }
        }

        System.out.println(unsortedMap);
        System.out.println(sortedMap);
    }

【讨论】:

    【解决方案2】:

    如果按照上述帖子how to sort Map values by key in Java的建议,你应该写这样的东西:

    Comparator<Foo> comparator = new Comparator<Foo>() {
      List<String> final order = .. //Pass your list here;
    
      public int compare(String o1, Stringo2) {
        int i1 = order.ingexOf(o1);
        int i2 = order.indexOf(o2);
        return i1 > i2 ? 1 : (i1 < i1 ? -1 : 0);
      }
    }
    Map<String, String> map = new TreeMap<>(comparator);
    map.addAll(abcd);
    

    但是你需要它做什么?如果您想稍后遍历此映射,则可以遍历列表然后获取值。它会更快。

    您应该从列表中删除重复项:

    List<String> efgh = new ArrayList<String>();
    ...
    efgh.add("aaa");
    ..
    efgh.add("aaa");
    

    否则此解决方案将不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 2018-11-15
      相关资源
      最近更新 更多