java两两组合(不重复)
1、最新做了一个经纬度相减获取最大距离的一个需求需要用到两两组合 因为用的是Set<String>所以自己转了一下数组
import java.util.*;
public class CombinationUtil {
/**
* 两两组合不重复(优化版)
* 公式: n*(n-1)/(2*1)
* @return 包含String[]的泛型集合(每个数组含2个元素)
*/
public static Set<String[]> printArrayCom() {
Set<String> sourceSet = new HashSet<>();
sourceSet.add("123@456");
sourceSet.add("111@222");
sourceSet.add("666@888");
sourceSet.add("777@222");
Set<String[]> resultSet = new HashSet<>();
String[] array = sourceSet.toArray(new String[0]); // 转换为数组
// 两两组合(i < j 确保不重复)
for (int i = 0; i < array.length; i++) {
for (int j = i + 1; j < array.length; j++) {
resultSet.add(new String[]{array[i], array[j]});
}
}
return resultSet;
}
public static void main(String[] args) {
Set<String[]> combinations = printArrayCom();
System.out.println("共有" + combinations.size() + "个组合");
// 第1种循环方式(迭代器)
Iterator<String[]> iterator = combinations.iterator();
while (iterator.hasNext()) {
String[] combo = iterator.next();
System.out.println(combo[0] + " , " + combo[1]);
}
System.out.println("=================分割线=================");
// 第2种循环方式(forEach)
combinations.forEach(combo ->
System.out.println(combo[0] + " , " + combo[1])
);
}
}

浙公网安备 33010602011771号