现实场景:将相同对象数据集内容进行生成出所有不重复的结构数据。
笛卡尔积是指两个集合中所有可能的有序对的集合。在Java中,我们可以通过多种方式实现笛卡尔积的计算。
这是最基本的方法,适用于两个集合的笛卡尔积计算。
javaimport java.util.ArrayList;
import java.util.List;
public class CartesianProduct {
public static <A, B> List<Pair<A, B>> cartesianProduct(List<A> listA, List<B> listB) {
List<Pair<A, B>> result = new ArrayList<>();
for (A a : listA) {
for (B b : listB) {
result.add(new Pair<>(a, b));
}
}
return result;
}
public static void main(String[] args) {
List<Integer> list1 = List.of(1, 2);
List<String> list2 = List.of("A", "B", "C");
List<Pair<Integer, String>> product = cartesianProduct(list1, list2);
product.forEach(p -> System.out.println(p.getFirst() + ", " + p.getSecond()));
}
}
class Pair<A, B> {
private final A first;
private final B second;
public Pair(A first, B second) {
this.first = first;
this.second = second;
}
public A getFirst() { return first; }
public B getSecond() { return second; }
}
Java 8的Stream API提供了更简洁的实现方式:
javaimport java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class CartesianProduct {
public static <A, B> List<Pair<A, B>> cartesianProduct(List<A> listA, List<B> listB) {
return listA.stream()
.flatMap(a -> listB.stream()
.map(b -> new Pair<>(a, b)))
.collect(Collectors.toList());
}
public static void main(String[] args) {
List<Integer> list1 = List.of(1, 2);
List<String> list2 = List.of("A", "B", "C");
List<Pair<Integer, String>> product = cartesianProduct(list1, list2);
product.forEach(p -> System.out.println(p.getFirst() + ", " + p.getSecond()));
}
}
对于多个集合的笛卡尔积,可以使用递归或Stream的reduce操作:
javaimport java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class CartesianProduct {
public static <T> List<List<T>> cartesianProduct(List<List<T>> lists) {
if (lists.isEmpty()) {
return Collections.singletonList(Collections.emptyList());
}
return lists.stream()
.reduce((list1, list2) -> list1.stream()
.flatMap(e1 -> list2.stream()
.map(e2 -> Stream.concat(e1.stream(), Stream.of(e2))
.collect(Collectors.toList()))
.collect(Collectors.toList()))
.orElse(Collections.emptyList());
}
public static void main(String[] args) {
List<List<String>> lists = List.of(
List.of("A", "B"),
List.of("1", "2"),
List.of("X", "Y")
);
List<List<String>> product = cartesianProduct(lists);
product.forEach(System.out::println);
}
}
Google的Guava库提供了现成的笛卡尔积工具:
javaimport com.google.common.collect.Lists;
import java.util.List;
public class CartesianProduct {
public static void main(String[] args) {
List<Integer> list1 = List.of(1, 2);
List<String> list2 = List.of("A", "B", "C");
List<List<Object>> product = Lists.cartesianProduct(list1, list2);
product.forEach(System.out::println);
}
}
以上方法可以根据具体需求选择使用,简单场景使用嵌套循环即可,复杂场景可以考虑使用Stream或第三方库。
本文作者:tiger
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!