Java如何生成List集合中元素的有序排列组合
实现方案
你需要的是列表元素的有序二元排列(即选取两个不同元素按顺序拼接),以下是兼容任意元素数量的通用实现:
基础嵌套循环实现(兼容所有Java版本)
逻辑直观,性能最优:
import java.util.ArrayList; import java.util.List; public class OrderedPairGenerator { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("MP"); list.add("Maharastra"); list.add("Karnataka"); List<String> permutationResult = generateOrderedPairs(list); // 输出结果和预期完全一致 System.out.println(permutationResult); } public static List<String> generateOrderedPairs(List<String> inputList) { List<String> result = new ArrayList<>(); int elementCount = inputList.size(); // 元素不足2个时无符合要求的排列,直接返回空 if (elementCount < 2) { return result; } for (int firstIndex = 0; firstIndex < elementCount; firstIndex++) { String firstElement = inputList.get(firstIndex); for (int secondIndex = 0; secondIndex < elementCount; secondIndex++) { // 跳过同一个元素的组合 if (firstIndex == secondIndex) { continue; } result.add(firstElement + ":" + inputList.get(secondIndex)); } } return result; } }
Java 8+ 流式实现
代码更简洁:
import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public class StreamOrderedPairGenerator { public static List<String> generateOrderedPairs(List<String> inputList) { return IntStream.range(0, inputList.size()) .boxed() .flatMap(firstIndex -> IntStream.range(0, inputList.size()) .filter(secondIndex -> firstIndex != secondIndex) .mapToObj(secondIndex -> inputList.get(firstIndex) + ":" + inputList.get(secondIndex))) .collect(Collectors.toList()); } }
验证说明
针对3个元素的测试用例,两种实现的输出均为:[MP:Maharastra, MP:Karnataka, Maharastra:MP, Maharastra:Karnataka, Karnataka:MP, Karnataka:Maharastra]
完全匹配预期。当输入列表有n个元素时,会自动生成n*(n-1)个排列结果,支持任意长度的输入。
内容的提问来源于stack exchange,提问作者marklogic_coder
相关产品推荐
相关产品推荐

