java - 根据输入列表中的原始排序合并 2 个列表 - JAVA
问题描述
我有以下功能:
List<Pair<SomeObject, Integer>> process(List<SomeObject> input) {
List<Pair<SomeObject, Integer>> result = new ArrayList<>();
List<SomeObject> couldBeProcessed = new ArrayList<>();
for (SomeObject obj : input) {
if (couldBeProcessed(obj)) {
couldBeProcessed.add(obj);
} else {
result.add(Pair.of(obj, 0));
}
}
List<Pair<SomeObject, Integer>> processResult = processInBatch(couldBeProcessed);
// TODO: merge processResult with result here
}
如何将其添加processResult
到results
但保留在 中给我的顺序input
?
解决方案
如何使用地图来保存索引,然后使用 'ol for 循环:
List<Pair<SomeObject, Integer>> process(List<SomeObject> input) {
List<Pair<SomeObject, Integer>> result = new ArrayList<>();
Map<Integer, Pair<SomeObject, Integer>> map = new HashMap();
List<SomeObject> couldBeProcessed = new ArrayList<>();
for (int i = 0; i < input.size(); i++) {
if (couldBeProcessed(input.get(i))) {
couldBeProcessed.add(obj);
} else {
map.put(i, Pair.newInstance(obj, 0));
}
}
List<Pair<SomeObject, Integer>> processResult = processInBatch(couldBeProcessed);
for (int i = 0; i < input.size(); i++) {
if (map.containsKey(i)) {
result.add(map.get(i));
} else {
result.add(processResult.remove(0));
}
}
}
您还可以使用Map#computeIfAbsent
使第二个循环更紧凑:
for (int i = 0; i < input.size(); i++) {
result.add(map.computeIfAbsent(i, index -> processResult.remove(0));
}
PS: 的元素processResult
必须与原始列表中的各个对象具有相同的索引。
@Misha 建议使用一种更自然的方式来处理已处理的队列 - 通过使用Deque
:
Deque<Pair<SomeObject, Integer>> processResult = new ArrayDeque(processInBatch(couldBeProcessed));
for (int i = 0; i < input.size(); i++) {
if (map.containsKey(i)) {
result.add(map.get(i));
} else {
result.add(processResult.removeFirst());
}
}
推荐阅读
- ios - 如何动态更新视图控制器
- android - 如何将 setColorFilter() 与动画一起应用?
- javascript - 检测关闭所有选项卡/关闭导航器上的当前选项卡
- vba - WIndows/VBA:不再识别特殊字符
- c++ - 为什么流写入文件,文件大小每次增加4k?
- python - 联邦学习时的张量类型错误
- angular - 最初调用时可观察到的返回未定义
- javascript - Firebase 分析未显示 Web 应用程序的数据
- swift - 如何在集合视图单元格中禁用 autoresizingmask 约束?
- c++ - C++ 将 HexString 转换为扩展的 Ascii 代码在文本文件中不显示正确的 ascii 代码