-1

我想知道一个程序有来自 Arraylists 的组合。场景如下。假设有 3 个不同的 Arraylist,如下所示。

前任:

  1. [银、白、灰、紫]
  2. [汽油,混合动力]
  3. [丰田,微型]

可以从上述三个 Arraylist 中创建如下所示的组合。

前任:

  1. 银色汽油丰田
  2. 银汽油微
  3. 银色混合动力丰田
  4. 银混合微型
  5. 白色汽油丰田
  6. 白色汽油微
  7. 白色混合动力丰田
  8. 白色混合微型
  9. 灰色汽油丰田
  10. 灰色汽油微
  11. 灰色混合动力丰田
  12. 灰色混合微型
  13. 紫色汽油丰田
  14. 紫汽油微
  15. 紫色混合动力丰田
  16. 紫色混合微

在我的情况下,数组列表的数量是动态的。一个数组列表的大小也是动态的。在这样的场景中,我想知道使用 Java 实现的方法。任何人都可以向我推荐一种使用 Java 的方法吗?

谢谢

4

3 回答 3

5

你可以把你拥有的所有List放到一个totalList中,它的类型是List>。一次组合 2 个列表以填充所有组合案例。

以下是供您参考的示例,它将根据需要打印信息。

注意: 它支持 List 的动态数量和 List 的动态大小

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test {

    public static void main(String[] args) {

        List<String> listOne = Arrays.asList("Silver", "White", "Grey",
                "Purple");
        List<String> listTwo = Arrays.asList("Petrol", "Hybrid");
        List<String> listThree = Arrays.asList("Toyota", "Micro");
        List<List<String>> totalList =  Arrays.asList(listOne,listTwo,listThree);

        new Test().printAllCases(totalList);
    }

    public void printAllCases(List<List<String>> totalList) {
        List<String> result = new ArrayList<String>(totalList.get(0));

        for(int index = 1; index < totalList.size(); index++) {
            result = combineTwoLists(result, totalList.get(index));
        }

        /* print */
        int count = 0;
        for(String s: result) {
            System.out.printf("%d. %s\n", ++count, s);
        }
    }

    private List<String> combineTwoLists(List<String> list1, List<String>   list2) {
        List<String> result = new ArrayList<String>();
        StringBuilder sb = new StringBuilder();
        for(String s1 : list1) {
            for(String s2: list2) {
                sb.setLength(0);
                sb.append(s1).append(' ').append(s2);
                result.add(sb.toString());
            }
        }
        return result;
    }
}
于 2013-11-05T05:56:32.373 回答
1

如果您不反对外部库,则guava-libraries提供了一种非常好的Sets.cartesianProduct方法,可以准确地做到这一点。当然,你最终会转换你的列表...

Set<String> colors = ImmutableSet.of("Silver", "White", "Grey", "Purple");
Set<String> fuelTypes = ImmutableSet.of("Petrol", "Hybrid");
Set<String> brands = ImmutableSet.of("Toyota", "Micro");

Set<List<String>> result = Sets.cartesianProduct(colors, fuelTypes, brands);
System.out.println(result);
于 2013-11-05T07:15:55.747 回答
0

想想这个伪代码:

for (i for size of array1) {
    for (j for size of array2) {
        for (k for size of array3) {
            print array1[i] + array2[j] + array3[k]
        }
    }
}

在Java中是这样的:

int i, j, k;
int count = 0;
for (i = 0; array1.size(); i++) {
    for (j = 0; array2.size(); j++) {
        for (k = 0; array3.size(); k++) {
            count++;
            System.out.println(count + ". " +array1.get(i) + array2.get(j) + array3.get(k));
        }
    }
}
于 2013-11-05T05:58:59.443 回答