按键对地图进行排序-说明

时间:2019-05-13 07:56:15

标签: java sorting dictionary

我想对包含以下格式数据的文本文件进行排序:

A 8
B 2
C 5

的值。所以我发现了这个:

Map<String, Long> getSortedLinkedHashMappedRankingArray(String[] rankingArray) {
    return Arrays
            .stream(rankingArray)
            .map(it -> it.split("\\s+"))
            .collect(Collectors.toMap(it -> it[FIRST_PART], it -> Long.valueOf(it[SECOND_PART])))
            .entrySet()
            .stream()
            .sorted(Map.Entry.comparingByValue())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (oldValue, newValue) -> oldValue, LinkedHashMap::new));
}

除上一次收集操作外,我几乎了解所有内容:

.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (oldValue, newValue) -> oldValue, LinkedHashMap::new))

您能解释一下这里发生了什么吗?什么是oldValue和newValue以及它们如何工作?

此外,我想听听我是否正确理解collect操作之前的部分。

  1. 所以首先,我们创建给定数组的流。
  2. 然后,我们用空格分割数组的每个元素,以便 可以将名称作为键,数字作为值在地图中。
  3. 然后我们创建地图元素集并创建流。
  4. 然后我们按值排序。

对吗?

PS:我正在读Java Sort map by key explanation,但我听不懂。

2 个答案:

答案 0 :(得分:1)

第三个参数java doc

#reshape and rename columns names
d = {'level_0':'a','level_1':'dates','level_2':'b'}
df = df.unstack().reset_index(name='vals').rename(columns=d)
print (df)
        a    dates         b  Desc  vals
0    SKU   11/5/18               0     1
1    SKU   11/5/18               0     1
2    SKU   12/5/18               0     2
3    SKU   12/5/18               0     2
4   Units  11/5/18   total=9     0     3
5   Units  11/5/18   total=9     0     3
6   Units  12/5/18   total=5     0     4
7   Units  12/5/18   total=5     0     4
8   Sales  11/5/18  total=33     0     5
9   Sales  11/5/18  total=33     0     5
10  Sales  12/5/18  total=60     0     6
11  Sales  12/5/18  total=60     0     6
     *    a merge function, used to resolve collisions between
     *                      values associated with the same key, as supplied
     *                      to {@link Map#merge(Object, Object, BiFunction)}

如果有重复的键,请选择上一个或新的

答案 1 :(得分:1)

(oldValue, newValue) -> oldValue, LinkedHashMap::new) lambda表达式是合并函数,该合并函数应用于具有相同键的两个值。在这种情况下,它将返回第一个值,并丢弃第二个值。

也就是说,您的代码效率很低,因为您要创建两个Map并运行两个Stream管道。您可以使用以下方法实现相同的目标:

Map<String, Long> getSortedLinkedHashMappedRankingArray(String[] rankingArray) {
    return Arrays
            .stream(rankingArray)
            .map(it -> it.split("\\s+"))
            .map(arr -> new SimpleEntry<> (arr[FIRST_PART], Long.valueOf(arr[SECOND_PART])))
            .sorted(Map.Entry.comparingByValue())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (oldValue, newValue) -> oldValue, LinkedHashMap::new));
}