gpt4 book ai didi

Java 列表过滤和查找第一个/查找最后一个

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:26 24 4
gpt4 key购买 nike

我有一个 java 对象列表。对象属性是:

public class CheckPoint {
private String message;
private String tag;
}

现在,我想找到基于标签的列表过滤器并获取第一个/最后一个元素。

例如:可能的标签值:A、B、C。对于值为 A 的标签 - 我想要最后一个元素,而 B - 我想要第一个元素, C - 第一个元素

当前解决方案:

CheckPoint inTransitCheckPoint = checkPointsList.stream().filter(c -> c.getTag().equals("A")).reduce((first, second) -> second).orElse(null);

CheckPoint useCheckPoint = checkPointsList.stream().filter(c -> c.getTag().equals("B")).findFirst.orElse(null);

CheckPoint typeCheckPoint = checkPointsList.stream().filter(c -> c.getTag().equals("C")).findFirst.orElse(null);

但是,我知道这是一个低效的解决方案,因为我们要循环三次。有人可以帮助我以更高效的方式解决它吗?

任何帮助将不胜感激,谢谢:)

最佳答案

我建议将 checkPointList 分组通过标签变成Map<String, LinkedList<CheckPoint>> :

Map<String, LinkedList<CheckPoint>> map = new HashMap<>();
map.put("A", new LinkedList<>());
map.put("B", new LinkedList<>());
map.put("C", new LinkedList<>());

for(CheckPoint c : checkPointList) {
map.computeIfAbsent(c.getTag(), ignored -> new LinkedList<>()).add(c);
}

链表是一个方便的 helper ,因为它允许您直接获取第一个或最后一个元素(如果不存在则返回 null ):

CheckPoint A = map.get("A").pollLast();
CheckPoint B = map.get("B").pollFirst();
CheckPoint C = map.get("C").pollFirst();

或者您可以更轻松地使用它 for-loop :

CheckPoint a = null, b = null, c = null;
for (CheckPoint checkPoint : checkPointList) {
String tag = checkPoint.getTag();
if ("A".equals(tag) && a == null) {
a = checkPoint;
} else if("B".equals(tag)){
b = checkPoint;
} else if("C".equals(tag)){
c = checkPoint;
}
}

"B" 的变量和 "C"总是被最后一个值覆盖,而对于 a只有第一个"A"将选择检查点。

关于Java 列表过滤和查找第一个/查找最后一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55284049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com