如何用二维String数组实现所有元素组合遍历(替代一维数组嵌套循环)
用二维数组实现多维度元素组合生成
当然可以用你给出的travel二维数组实现和原来嵌套循环完全一样的组合效果!关键是要先理清这个二维数组和原来多个一维数组的对应关系:
原来的每个一维数组(pos、color、cars等),对应到travel数组里的一列:
pos数组的所有元素 =travel的第0列(travel[0][0],travel[1][0], ...,travel[4][0])color数组的所有元素 =travel的第1列(travel[0][1],travel[1][1], ...,travel[4][1])- 以此类推,
time数组对应travel的第5列
理解了这个对应关系后,只需要修改嵌套循环中取元素的方式,就能生成完全相同的组合:
String[][] travel = { {"1 ", "green ", "xtrail ", "canada ", "sydney ", "5am"}, {"2 ", "red ", "camry ", "british ", "goldcoast ", "6am"}, {"3 ", "white ", "civic ", "french", "newcastle ", "7am"}, {"4 ", "black ", "accent ", "chinese ", "tamworth ", "8am"}, {"5 ", "blue ", "barina ", "indian ", "portmaq ", "9am"} }; // 生成所有组合,逻辑和原嵌套循环完全一致 for (int a = 0; a < travel.length; a++) { // 遍历第0列(对应原pos数组) for (int b = 0; b < travel.length; b++) { // 遍历第1列(对应原color数组) for (int c = 0; c < travel.length; c++) { // 遍历第2列(对应原cars数组) for (int d = 0; d < travel.length; d++) { // 遍历第3列(对应原home数组) for (int e = 0; e < travel.length; e++) { // 遍历第4列(对应原location数组) for (int f = 0; f < travel.length; f++) { // 遍历第5列(对应原time数组) String[] ans = { travel[a][0], // 取第0列的第a个元素(等价于pos[a]) travel[b][1], // 取第1列的第b个元素(等价于color[b]) travel[c][2], // 取第2列的第c个元素(等价于cars[c]) travel[d][3], // 取第3列的第d个元素(等价于home[d]) travel[e][4], // 取第4列的第e个元素(等价于location[e]) travel[f][5] // 取第5列的第f个元素(等价于time[f]) }; // 这里可以添加对组合的处理逻辑,比如打印查看结果 // System.out.println(String.join(" | ", ans)); } } } } } }
关键细节说明
- 这个代码生成的组合数量和原代码完全相同:
5^6 = 15625种,每个组合的元素也和原代码一一对应。 - 虽然
travel数组的结构不是最直观的(通常我们会把每个一维数组作为二维数组的一行,比如new String[][]{pos, color, cars, home, location, time}),但只要明确列与原一维数组的对应关系,就能轻松实现需求。 - 如果你想进一步优化(比如避免多层嵌套循环),可以用递归或回溯的方式动态遍历所有维度,但如果只是要和原嵌套循环的逻辑对齐,上面的代码就足够清晰了。
内容的提问来源于stack exchange,提问作者Barkley101
相关产品推荐
相关产品推荐

