我想合并 2 个具有这些条件的列表
List<int> A = {1,1,1,null,null,null,null,null,null};
List<int> B = {null,null,null,2,2,2,null,null,null};
合并后我想要的结果
List<int> C = {1,1,1,2,2,2,null,null,null}
其中
null
中的 list A
值将替换为 list B
中的值,另外,如果存在像 1 , null, 1, null
这样的情况,我尝试将它用于循环,但我花费了很多性能,我想要一个正确的做法
for(int i = 0; i <A.size; i++)
{
for(int j=0 ;j <B.size; j++)
}
根据我对问题的理解。
情况 1:如果两个列表大小相等,那么您可以使用 Java 流 API 编写一致的代码,无需任何循环。
List<Integer> C = IntStream.range(0, A.size())
.mapToObj(i -> {
Integer a = A.get(i);
Integer b = A.get(i);
if (a == null && b != null) {
return b;
} else if (a != null && b == null) {
return a;
} else {
// assuming when both the value are present
// you want to return from list A
return a;
}
})
.collect(Collectors.toList());
情况 2:如果两个列表的大小可以不相等。
List<Integer> C = IntStream.range(0, Math.max(A.size(), B.size()))
.mapToObj(i -> {
Integer a = i < A.size() ? A.get(i) : null;
Integer b = i < B.size() ? B.get(i) : null;
if (a == null && b != null) {
return b;
} else if (a != null && b == null) {
return a;
} else {
// assuming when both the value are present
// you want to return from list A
return a;
}
})
.collect(Collectors.toList());
2 循环意味着您的代码运行内部位
A * B
次,这是您不希望的。您只想运行它“A”次,假设 A 和 B 大小相等,否则运行 max(A.size(), B.size())
次。
var out = new ArrayList<Integer>();
for (int i = 0; i < a.size(); i++) {
Integer v = a.get(0);
if (v == null) v = b.get(0);
out.add(v);
}