从arraylists的元素中检索所有组合

时间:2013-11-05 05:44:36

标签: java arraylist

我想知道一个程序有Arraylists的组合。情景如下。 可以说下面有3种不同的Arraylists。

前:

  1. [银色,白色,灰色,紫色]
  2. [汽油,混合动力]
  3. [丰田,微]
  4. 在以上三个Arraylists中,可以创建如下所示的组合。

    前:

    1. Silver Petrol Toyota
    2. Silver Petrol Micro
    3. Silver Hybrid Toyota
    4. Silver Hybrid Micro
    5. White Petrol Toyota
    6. White Petrol Micro
    7. White Hybrid Toyota
    8. White Hybrid Micro
    9. Grey Petrol Toyota
    10. Gray Petrol Micro
    11. Grey Hybrid Toyota
    12. Gray Hybrid Micro
    13. 紫色汽油丰田
    14. Purple Petrol Micro
    15. 紫色混合动力丰田
    16. Purple Hybrid Micro
    17. 就我而言,arraylists的数量是动态的。一个arraylist的大小也是动态的。在这样的场景中,我想知道使用Java实现的方法。 任何人都可以建议我使用Java的方法吗?

      谢谢

3 个答案:

答案 0 :(得分:4)

您可以将所有列表放入totalList,其类型为List>。一次合并2个列表以填充所有组合案例。

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

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

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;
    }
}

答案 1 :(得分: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);

答案 2 :(得分: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));
        }
    }
}