java - 获取列表中特定字符串的最后一次出现
问题描述
我有一个简单的字符串列表。我的目标是按组获取列表中每个字符串的最后一次出现。
这是模式代码:
List<String> newData = new ArrayList<>();
newData.add("A-something");
newData.add("A-fdfdsfds");
newData.add("A-fdsfdsfgs");
newData.add("B-something");
newData.add("B-dsafdrsafd");
newData.add("B-dsdfsad");
我希望只得到每组的最后一次出现。换句话说,我只想得到“A-fdsfdsfgs”和“B-dsdfsad”。
怎么做?
解决方案
要获取每个组的最后一次出现,您可以使用带有 groupingBy 的流 api:
import static java.util.stream.Collectors.*;
Map<String, Optional<String>> collect = newData.stream()
.collect(groupingBy(strings -> strings.split("-")[0],
mapping(s -> s, maxBy(Comparator.comparingInt(newData::lastIndexOf)))));
注意:地图有Optional
一个值
要获得它而不Optional
使用toMap
而不是groupingBy
:
Map<String, String> collect = newData.stream()
.collect(toMap(s -> s.split("-")[0],
Function.identity(),
(s1, s2) -> newData.lastIndexOf(s1) > newData.lastIndexOf(s2) ? s1 : s2));
此外,如果您想拥有没有组名的地图值,请更改Function.identity()
为s -> s.split("-")[1]
推荐阅读
- typescript - 模拟 axios 和 API 获取请求
- python - 强制子类覆盖父类的类属性
- node.js - 如何检查数据库中是否存在已定义的值 - Discord.js
- python - 从桌面运行 Python 脚本
- c++ - 如何使用 std::declval 查找模板函数的返回值?
- r - 在 R Survey 包中传递表达式作为参数
- react-native - 如何使用 axios 对 cgi 文件进行 api 调用
- node.js - 我正在尝试从 Node.JS 中的 JSON 获取值
- c# - 序列化使用多态性的对象集合(基类)
- spring - Spring Boot Confusion(在spring boot框架中使用spring cloud依赖)