我有HashMap<String, List<String>>
,我无法弄清楚如何按第3个列表项对其进行排序。我尝试过使用比较器,但我可以看看第3个列表项。
我正在使用的HashMap:
HashMap<String, List<String>> hmap= new HashMap<String, List<String>>();
List<String> prod1 = new ArrayList<String>();
prod1.add("123456789102");
prod1.add("3.0");
prod1.add("8");
hmap.put("Blue magazine", prod1);
List<String> prod2 = new ArrayList<String>();
prod2.add("123456789102");
prod2.add("2.0");
prod2.add("7");
hmap.put("Pink magazine", prod2);
List<String> prod3 = new ArrayList<String>();
prod3.add("123456789102");
prod3.add("1.0");
prod3.add("6");
hmap.put("Black magazine", prod3);
我正在尝试将它排序为低 - 高(整数)第二个列表项。 所以:6 - 7 - 8
List list = new LinkedList(map.entrySet());
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
return ((Comparable) ((Map.Entry)(o1)).getValue()).compareTo(((Map.Entry)(o2)).getValue());
}
});
编辑:为每个请求添加了比较器尝试。
答案 0 :(得分:0)
您是否考虑在访问元素时对其进行排序?
即
for (String key : hmap.keySet().stream()
.sorted((o1,o2) -> hmap.get(o1).get(2).compareTo(hmap.get(o2).get(2)))
.collect(Collectors.toList())){
System.out.println(key);
}
没有lambda它会看起来像
List<String> list = new ArrayList<>(hmap.keySet());
Collections.sort(list,new Comparator<String>(){
public int compare(String o1, String o2) {
return hmap.get(o1).get(2).compareTo(hmap.get(o2).get(2));
} });
for (String key :list ){
System.out.println(key);
}
答案 1 :(得分:0)
我最终解决此问题的方法是手动排序并将密钥保存到单独的列表中。然后当我稍后调用HashMap项时,我只是按顺序使用列表中的键。
public List<String> sortProducts(HashMap<String, List<String>> map) {
HashMap<String, List<String>> preMap = map;
List<String> sortedNames = new ArrayList<String>();
while (preMap.size() > 0) {
Integer currentLowest = 100;
String currentLowestKey = null;
for (String key: preMap.keySet()) {
if (Integer.parseInt(map.get(key).get(2)) < currentLowest) {
currentLowest = Integer.parseInt(map.get(key).get(2));
currentLowestKey = key;
}
}
sortedNames.add(currentLowestKey);
preMap.remove(currentLowestKey);
currentLowest = 100;
currentLowestKey = null;
}
Collections.reverse(sortedNames);
return sortedNames;
}
答案 2 :(得分:0)
另一种方法,不需要访问比较器中的list
和hmap
,并生成有序地图:
List<Map.Entry<String,List<String>>> list =
new LinkedList<Map.Entry<String,List<String>>>(hmap.entrySet());
Collections.sort( list, new Comparator<Map.Entry<String,List<String>>>() {
public int compare( Map.Entry<String,List<String>> o1,
Map.Entry<String,List<String>> o2) {
return o1.getValue().get( 2 ).compareTo( o2.getValue().get(2) );
}
});
Map<String, List<String>> result = new LinkedHashMap<String, List<String>>();
for ( Map.Entry<String, List<String>> n : list )
result.put( n.getKey(), n.getValue() );