根据地图的优先级对列表进行排序

时间:2014-08-18 20:11:33

标签: java data-structures

我有一个简单的地图,需要创建一个列表,该列表根据给定列表中的升序排序:

Map auto = new HashMap();
auto.put("Merc", 3);
auto.put("Citroen", 5);
auto.put("Opel", 10);
auto.put("BMW", 20);

List<String> given = new ArrayList<>();
given.add("Opel");
given.add("BMW");
given.add("Citroen");

因此需要对给定的清单进行排序,使其按顺序排列:雪铁龙,欧宝,宝马。想到了:

  1. 创建另一个地图,然后迭代列表
  2. 从第一张地图中获取号码
  3. 将数字作为键,将名称作为新地图中的值
  4. 按键排序地图
  5. 迭代投掷新地图,然后将值添加到列表
  6. 这看起来很可怕:/,任何建议,也许更好的数据结构使用?

5 个答案:

答案 0 :(得分:5)

使用Java 8,你可以做到。

Map<String, Integer> auto = new HashMap<>();
auto.put("Merc", 3);
auto.put("Citroen", 5);
auto.put("Opel", 10);
auto.put("BMW", 20);

List<String> given = new ArrayList<>();
given.add("Opel");
given.add("BMW");
given.add("Citroen");

// to sort the selected elements.
given.sort(Comparator.comparing(auto::get));

// to sort all elements.
List<String> names = auto.entrySet().stream()
        .sorted(Comparator.comparing(Map.Entry::getValue))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());

打破这个

List<String> names = 
         // give the set of entries as a Stream.
         auto.entrySet().stream()
        // sort these entries, using the field returned by getValue()
        .sorted(Comparator.comparing(Map.Entry::getValue))
        // now sorted, turn each Entry into just the getKey()
        .map(Map.Entry::getKey)
        // now we have a stream of keys, turn this into a List<String>
        .collect(Collectors.toList());

答案 1 :(得分:4)

Collections#sort

Collections.sort(given, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return auto.get(o1).compareTo(auto.get(o2));
    }
});

或者使用lambda:

Collections.sort(given, (o1, o2) -> auto.get(o1).compareTo(auto.get(o2)));

Java 8 null-safe解决方案受到多个答案的启发

given.sort(Comparator.comparing((s) -> auto.getOrDefault(s, Integer.MAX_VALUE)));

答案 2 :(得分:3)

使用Java 8,你可以做到

given.sort(Comparator.comparing(auto::get));

......它只是一个班轮。或者你可以使用Guava库

Collections.sort(given, Ordering.natural().onResultOf(Functions.forMap(auto)));

答案 3 :(得分:0)

创建一个实现Car的{​​{1}}类,并包含名称和优先级。

然后,您可以直接使用Comparable对列表进行排序。

答案 4 :(得分:0)

Map<String,Integer> auto = new HashMap<String,Integer>();
auto.put("Merc", 3);
auto.put("Citroen", 5);
auto.put("Opel", 10);
auto.put("BMW", 20);

Set<Map.Entry<String,Integer>> set = auto.entrySet();
List<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(set);
Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){

             @Override
            public int compare(Entry<String, Integer> o1,
                    Entry<String, Integer> o2) {

                return o1.getValue().compareTo(o2.getValue());
            }
});

获得Map.Entry的列表对象后,您可以使用Entry.getKey()

提取密钥