我的目标是给出一个返回升序数组/排序键值列表的映射。例如:
输入:包含以空格分隔的以下键/值条目的地图:
"Apple" 10
"Orange" 8
"Kiwi" 15
输出:
{Orange;Apple;Kiwi}
我能想到的唯一另一种方法是创建一个Map<Integer,Set<String>>
,然后按相当复杂的键进行排序。我得到了这种方法,但在代码和逻辑方面似乎效率很低。非常感谢!
答案 0 :(得分:1)
一种技术是将Map推送到List中,然后使用Comparator对值进行排序,然后再将其放回Map中。
例如,像:List<Map.Entry<String, Integer>> list =
new LinkedList<Map.Entry<String, Integer>>(mapYouPassedIn.entrySet());
然后你可以使用Collections.sort()和一个Comparator来对这个列表进行笨拙的工作。
答案 1 :(得分:1)
在 java 8 中,使用流有一种非常简单的方法:
map.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.collect(Collectors.toList());
例如:
public class Test {
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("A", 2);
map.put("B", 3);
map.put("C", 1);
System.out.println(map.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.collect(Collectors.toList()));
}
}
打印[C,A,B]
答案 2 :(得分:0)
您可以从hashMap获取entrySet并对Map.entry列表进行排序。 例如:
List<Map.Entry<Integer, Integer>> list = new LinkedList<Map.Entry
<Integer, Integer>>( map.entrySet() );
Comparator<Map.Entry<Integer, Integer>> comp =
new Comparator<Map.Entry<Integer, Integer>>()
{
@Override
public int compare( Entry<Integer, Integer> o1, Entry<Integer, Integer> o2 )
{
return ( o1.getValue() ).compareTo( o2.getValue() );
}
};
Comparator<Map.Entry<Integer, Integer>> cmp1 = Collections.reverseOrder( comp );
Collections.sort( list, cmp1 );