我想对包含以下格式数据的文本文件进行排序:
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
操作之前的部分。
对吗?
PS:我正在读Java Sort map by key explanation,但我听不懂。
答案 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));
}