将地图拆分成两个列表

4

我有一个Map<String,Integer>,并且按值进行排序,就像这样:

set = map.entrySet();
list = new ArrayList<Map.Entry<String, Integer»(set);
Collections.sort( list, (o1, o2) -> (o2.getValue()).compareTo( o1.getValue() ));

我已经有了一个从该映射中排序后的整数列表:

word_used = new ArrayList<Integer>(map.values() 
.stream() 
.sorted() 
.collect(Collectors.toList())); 
Collections.reverse(word_used); 

但是我该如何获得一个字符串列表,使其与 Map(按值排序)相同呢?
我的意思是,如果我有一个包含以下条目的映射:
map.put("eggs",1500); 
map.put("echo",150); 
map.put("foo",320); 
map.put("smt",50); 

并将其排序,如下:

eggs : 1500 
foo : 320 
echo : 150 
smt : 50 

我需要获取2个列表:

eggs 
foo 
echo 
smt

并且

1500 
320 
150 
50

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - jr593
请注意,说“Map已排序”是具有误导性的。构建和排序Map条目的List对该Map的集合视图的迭代顺序没有影响。您只有一个已排序的List - 尽管这仍然可能很有用。 - John Bollinger
4个回答

3
您可以使用map()将投影添加到您的流中,如下所示:
List<String> word_used = map.entrySet() 
        .stream() 
        .sorted(Comparator.comparing(Map.Entry<String,Integer>::getValue).reversed())
        .map(Map.Entry<String,Integer>::getKey)
        .collect(Collectors.toList());

List<Integer> ints_used = map.entrySet() 
        .stream() 
        .sorted(Comparator.comparing(Map.Entry<String,Integer>::getValue).reversed())
        .map(Map.Entry<String,Integer>::getValue)
        .collect(Collectors.toList());

演示1

注意,此方法排序两次。您可以仅一次捕获条目,然后从该临时列表中进行投影,如下所示:

List<Map.Entry<String,Integer>> sortedList = map
        .entrySet() 
        .stream() 
        .sorted(Comparator.comparing(Map.Entry<String,Integer>::getValue).reversed())
        .collect(Collectors.toList());

List<String> word_used = sortedList
        .stream()
        .map(Map.Entry<String,Integer>::getKey)
        .collect(Collectors.toList());

List<Integer> ints_used = sortedList
        .stream()
        .map(Map.Entry<String,Integer>::getValue)
        .collect(Collectors.toList());

Demo 2


2
你已经有一个按照你描述的顺序排好序的Entry映射列表(由变量list引用)。你可以只从这些对象中构造新的、分离的键和值的List。非流版本可能是:
List<String> words = new ArrayList<>();
List<Integer> values = new ArrayList<>();

for (Map.Entry<String, Integer> entry : list) {
    words.add(entry.getKey());
    values.add(entry.getValue());
}

0
使用这种方法,可以仅进行一次排序和迭代:
    List<String> word_used = new ArrayList<String>();
    List<Integer> ints_used = map.entrySet().stream() 
        .sorted(Comparator.comparing(Map.Entry<String,Integer>::getValue).reversed())
        .peek(e -> word_used.add(e.getKey()))
        .map(Map.Entry::getValue)
        .collect(Collectors.toList());

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接