获取对象数组的所有可能组合

时间:2017-07-18 21:49:19

标签: java algorithm pseudocode

我在开发应用程序时突然停止了。

我需要获取Arguments数组的所有可能组合,例如数组看起来像这样

[整数,布尔,字符串]

总的可能组合将是7(2 ^ X - 1,其中X是参数的数量,这是我和朋友在试图解决这个问题时想出的公式)

这里是可能组合的可视化。
[整数,布尔,字符串],
[整数,布尔],
[整数,字符串],
[整数],
[布尔,字符串],
[布尔]和
[字符串]

正如你在可视化中看到的那样,唯一必要的是条目总是相对于彼此具有相同的顺序(整数必须始终在布尔和String之前,并且布尔必须始终在String之前)

我要问的是:
如何找到一系列字符串的每种可能组合,其中组合不限于当前条目的任何特定长度,但仅限于条目相对于彼此的相同顺序?< /强>

如果有人能给我一个正确的方向,那将非常感激。我一直在寻找一些关于找到所有可能价值的帖子,但我找不到任何对我有任何帮助的帖子。

如果需要有关此问题的任何进一步信息,请随时提问

3 个答案:

答案 0 :(得分:2)

让我给你提示:

检查十进制数的二进制表示:

0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111

现在,让我们以这种方式安排你的组合:

[_, _, _]
[_, _, S]
[_, B, _]
[_, B, S]
[I, _, _]
[I, _, S]
[I, B, _]
[I, B, S]

下一步是您实现N位数

答案 1 :(得分:1)

试试这个。

String[] array = {"Integer","Boolean","String"};
for (int i = 1, max = 1 << array.length; i < max; ++i) {
    for (int j = 0, k = 1; j < array.length; ++j, k <<= 1)
        if ((k & i) != 0)
            System.out.print(array[j] + " ");
    System.out.println();
}

结果

Integer 
Boolean 
Integer Boolean 
String 
Integer String 
Boolean String 
Integer Boolean String 

答案 2 :(得分:0)

您正在考虑组合问题。如果你有(1..N)个参数,你会希望使用输入(1..N)来组合序列。检索组合后 - 您可以使用值(v1,v2,v3)作为argumentList数组的索引来检索特定的对象组合。 使用geeksforgeeks中的以下代码作为参考,您可以在此基础上构建。

    // Java program to print all combination of size r in an array of size n
import java.io.*;

class Permutation {

    /* arr[]  ---> Input Array
    data[] ---> Temporary array to store current combination
    start & end ---> Staring and Ending indexes in arr[]
    index  ---> Current index in data[]
    r ---> Size of a combination to be printed */
    static void combinationUtil(int arr[], int data[], int start,
                                int end, int index, int r)
    {
        // Current combination is ready to be printed, print it
        if (index == r)
        {
            for (int j=0; j<r; j++)
                System.out.print(data[j]+" ");
            System.out.println("");
            return;
        }

        // replace index with all possible elements. The condition
        // "end-i+1 >= r-index" makes sure that including one element
        // at index will make a combination with remaining elements
        // at remaining positions
        for (int i=start; i<=end && end-i+1 >= r-index; i++)
        {
            data[index] = arr[i];
            combinationUtil(arr, data, i+1, end, index+1, r);
        }
    }

    // The main function that prints all combinations of size r
    // in arr[] of size n. This function mainly uses combinationUtil()
    static void printCombination(int arr[], int n, int r)
    {
        // A temporary array to store all combination one by one
        int data[]=new int[r];

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

    /*Driver function to check for above function*/
    public static void main (String[] args) {
        int arr[] = {1, 2, 3, 4, 5};
        int r = 3;
        int n = arr.length;
        printCombination(arr, n, r);
    }
}

参考:http://www.geeksforgeeks.org/print-all-possible-combinations-of-r-elements-in-a-given-array-of-size-n/