3 回答
TA贡献1998条经验 获得超6个赞
这是使用流的解决方案:
public static <T> List<T> mixingList(List<T> list1, List<T> list2) {
int shorter = Math.min(list1.size(), list2.size());
int longer = Math.max(list1.size(), list2.size());
Stream<T> firstPart = IntStream.range(0, shorter).mapToObj(x -> Stream.of(list1.get(x), list2.get(x))).flatMap(x -> x);
if (longer > shorter) {
Stream<T> secondPart = (list1.size() > list2.size() ? list1 : list2).subList(shorter, longer).stream();
return Stream.concat(firstPart, secondPart).collect(Collectors.toList());
} else {
return firstPart.collect(Collectors.toList());
}
}
魔法发生在mapToObj和中flatMap。它将每个索引映射到两个列表元素的流,一个来自每个给定的列表。然后它用 . 压扁流的流flatMap。
之后,如果两个列表的大小不同,它会获取较长列表的其余部分并将其连接到末尾。
TA贡献1825条经验 获得超6个赞
一种方法可能是使用 anIntStream获取列表索引流,Optional根据列表是否包含此索引将它们映射到 s,然后解析它们,但老实说,我不确定这是否更优雅比你原来的方法:
public <T> List<T> mixingList(List<T> list1, List<T> list2) {
int maxSize = Math.max(list1.size(), list2.size());
return IntStream.range(0, maxSize)
.mapToObj(i -> Stream.of(listIndexToOptional(list1, i),
listIndexToOptional(list2, i)))
.flatMap(Function.identity())
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
}
private static <T> Optional<T> listIndexToOptional(List<T> list, int index) {
return index < list.size() ? Optional.of(list.get(index)) : Optional.empty();
}
TA贡献1853条经验 获得超9个赞
您可以将其分成两部分。首先,你得到两个列表的最小数量,然后混合两个列表直到这个索引。之后,您将剩余的项目附加到更大的列表中。要结合两者,您可以使用Stream.concat():
private static <T> List<T> mixingList(List<T> list1, List<T> list2) {
int min = Math.min(list1.size(), list2.size());
return Stream.concat(
IntStream.range(0, min).boxed()
.flatMap(i -> Stream.of(list1.get(i), list2.get(i))),
(list1.size() < list2.size() ? list2 : list1).stream().skip(min)
).collect(Collectors.toList());
}
或者,您可以Stream.concat()在使用时使用Stream.flatMap():
private static <T> List<T> mixingList(List<T> list1, List<T> list2) {
return IntStream.range(0, Math.max(list1.size(), list2.size())).boxed()
.flatMap(i -> Stream.concat(
i < list1.size() ? Stream.of(list1.get(i)) : Stream.empty(),
i < list2.size() ? Stream.of(list2.get(i)) : Stream.empty()))
.collect(Collectors.toList());
}
添加回答
举报