我在HashMap中有团队和他们的点。我能够按他们的值对它们进行排序。
Map<String, Integer> sortedMap = Points.entrySet().stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
现在我想遍历sortedMap并按顺序打印键,如果有匹配的值,则对具有相同值的键进行排序,然后打印结果。
答案 0 :(得分:6)
您可以使用thenComparing
链接比较器:
Map<String, Integer> sortedMap = Points.entrySet().stream()
.sorted(Collections
.reverseOrder(
Map.Entry.<String, Integer>comparingByValue())
.thenComparing(Map.Entry.comparingByKey()))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue,
(e1, e2) -> e1, LinkedHashMap::new));
这会将您现有的单一比较更改为两级比较。当第一个比较器认为两个元素相等时,第二个元素用于确定顺序。
请注意,Java 8为比较器引入了reversed
方法,它比Collections.reverseOrder
略微冗长:
Map<String, Integer> sortedMap = in.entrySet().stream()
.sorted(Map.Entry.<String, Integer>comparingByValue().reversed()
.thenComparing(Map.Entry.comparingByKey()))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue,
(e1, e2) -> e1, LinkedHashMap::new));
答案 1 :(得分:1)
Collections.sort( list, new Comparator<Map.Entry<String, Integer>>()
{
public int compare( Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2 )
{
int cmp=o1.getValue().compareTo( o2.getValue());
if(cmp ==0)
return (o1.getKey().compareTo( o2.getKey() );//Ascending order
else{
return cmp;
}
} );
答案 2 :(得分:0)
让我们将其划分为不同的部分,一次处理一项任务:
任务编号一:迭代地图
根据Map API,您可以通过调用keySet()
从地图中获取一组键。
for (String s : sortedMap.keySet()) {
System.out.println(s + ": " + sortedMap.get(s));
}
这将打印出地图中的所有键值对。
任务编号二:检查匹配值并排序
我们将使用具有相同值的List
个字符串。通过像这样重新排序我们的地图,我们可以使用列表的长度来确定该值是否由多个字符串共享。
Map<Integer, List<String>> reveresed = new LinkedHashMap<Integer, List<String>>();
for (String s : sortedMap.keySet()) {
if (reversed.contains(sortedMap.get(s)) {
reversed.get(sortedMap.get(s)).add(s);
}
else
{
List<String> values = new ArrayList<String>();
values.add(s);
reversed.put(sortedMap.get(s), values);
}
}
使用它,查询是否有重复项,我们可以检查:
if (reversed.get(value) != null && reversed.get(value).size() >= 2) {
// Value is repeated
}
答案 3 :(得分:0)
为了完整起见,这里有一种方法可以使用Java 8功能,但没有流:
List<Entry<String, Integer>> entries = new ArrayList<>(points.entrySet());
entries.sort(Entry.<String, Integer>comparingByValue().reversed()
.thenComparing(Entry.comparingByKey()));
Map<String, Integer> sortedMap = new LinkedHashMap<>(points.size());
entries.forEach(e -> sortedMap.put(e.getKey(), e.getValue()));