我有一个简单的地图,需要创建一个列表,该列表根据给定列表中的升序排序:
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");
因此需要对给定的清单进行排序,使其按顺序排列:雪铁龙,欧宝,宝马。想到了:
这看起来很可怕:/,任何建议,也许更好的数据结构使用?
答案 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(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()