修改Java List过滤逻辑:匹配保留原值,不匹配填充0
修改Java过滤逻辑,保留原列表长度并替换不存在元素为0
嗨,这个需求很好实现!你之前的代码用filter会直接移除不匹配的元素,所以输出列表长度和原lines不一致。我们只需要把流式操作里的filter换成map,对每个元素做判断转换就能达到目标:
import java.util.List; import java.util.Set; import java.util.HashSet; import java.util.stream.Collectors; public List<Integer> filter(List<Integer> lines, List<Integer> programLines) { // 优化:将programLines转为HashSet,提升contains方法的查询效率 Set<Integer> programLineSet = new HashSet<>(programLines); return lines.stream() .map(line -> programLineSet.contains(line) ? line : 0) .collect(Collectors.toList()); }
关键说明:
- 用
map替代filter:map会遍历处理每一个元素,不会过滤掉任何元素,这样就能保证输出列表的长度和输入lines完全一致 - 引入
HashSet的优化:如果你的programLines数据量较大,ArrayList.contains()的时间复杂度是O(n),多次调用会拖慢性能;而HashSet.contains()是O(1)的查询效率,能大幅提升处理速度。如果数据量很小,你也可以直接用programLines.contains(line),不影响功能。
测试一下你给出的例子:
当programLines为[1, 2, 4, 5, 5, 6, 6, 7, 7, 9, 13]、lines为[9, 10, 13, 14]时,输出结果就是[9, 0, 13, 0],完全符合你的预期。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

