如何在java中创建包含两个列表元素组合的列表

时间:2017-08-03 09:33:19

标签: java collections java-8

使用java

中的两个列表元素的组合创建列表
  

listOne = {1 2 3} listTwo = {7 8 9}

     

resultantList = {{1,2,7},{1,2,8},{1,2,9},{2,3,7},{2,3,8},{2,3 ,9},{1,3,7},{1,3,8},{1,3,9}}

我想用第一个列表中的2个元素和第二个列表中的一个元素组合创建第二个列表。

2 个答案:

答案 0 :(得分:1)

 leftList.stream()
         .flatMap(x -> x.stream().map(y -> new Pair(x, y))
         .collect(Collectors.toList());

好像你需要这个:

 List<Integer> left = Arrays.asList(1, 2, 3);
    List<Integer> right = Arrays.asList(7, 8, 9);

    IntStream.range(0, left.size())
            .boxed()
            .flatMap(x -> left.stream().skip(x + 1).map(y -> new int[] { left.get(x), y }))
            .flatMap(arr -> right.stream().map(z -> new int[] { arr[0], arr[1], z }))
            .map(Arrays::toString)
            .forEach(System.out::println);

    // [1, 2, 7]
    // [1, 2, 8]
    // [1, 2, 9]
    // [1, 3, 7]
    // [1, 3, 8]
    // [1, 3, 9]
    // [2, 3, 7]
    // [2, 3, 8]
    // [2, 3, 9]

答案 1 :(得分:0)

我做了一个有效的解决方案,请在下面找到。

public class TestClass {

    static ArrayList<ArrayList<Integer>> fullData = new ArrayList<>();
    static ArrayList<ArrayList<Integer>> finalList = new ArrayList<>();
    static int listTwocounter = 0;

    public static void main(String[] args) {

        int listOne[] = {1, 2, 3};
        int listTwo[] = {7, 8, 9};
        int listOneCombination = 2;
        int listOneSize = 3;

        printCombination(listOne, listTwo, listOneSize, listOneCombination);
    }

    static void printCombination(int listOne[], int listTwo[], int n, int r)
    {
        // A temporary array to store all combination one by one
        int data[] = new int[5];

        // Print all combination using temprary array 'data[]'
        combinationUtil(listOne, listTwo, data, 0, n-1, 0, r);

        //fullData
        // Add elements from 2nd list
        for (ArrayList<Integer> temp : fullData)
        {
            for(int i=0; i<listTwo.length; i++)
            {
                ArrayList<Integer> local = new ArrayList<>();
                for(int x : temp)
                    local.add(x);

                local.add(listTwo[i]);
                finalList.add(local);
            }
        }
    }

    static void combinationUtil(int listOne[], int listTwo[], int data[], int start, int end,
                         int index, int r)
    {
        ArrayList<Integer> tempData;

        if (index == r)
        {
            tempData = new ArrayList<>();
            for (int j=0; j<r; j++)
                tempData.add(data[j]);

            fullData.add(tempData);
            return;
        }

        for (int i=start; i<=end && end-i+1 >= r-index; i++)
        {
            data[index] = listOne[i];
            combinationUtil(listOne, listTwo, data, i+1, end, index+1, r);
        }
    }
}

希望这会有所帮助。如果这符合您的要求,请告诉我。 : - )