按照其他列表中的值排序的键对地图进行排序

时间:2015-10-05 07:36:50

标签: java

我有一个带有键字符串的Map和值String以及一个字符串列表。我想根据列表中存在的值的顺序使用键对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列表中的值的顺序排序。

2 个答案:

答案 0 :(得分:1)

HashMaps是不可排序的,而是使用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);
    }

答案 1 :(得分:0)

如果遵循上述帖子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");

否则此解决方案无效。