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());
}
添加回答
舉報