【问题标题】:How to generate combinations of array values withrespect of its key values如何根据其键值生成数组值的组合
【发布时间】:2015-11-04 09:39:40
【问题描述】:

如何根据其键值生成数组值的组合

我有以下来自文件的输入。字符串索引键和值数组

SL  [1,3]
SW  [5,7]
PL  [11,12]
PW  [16]

我正在尝试生成以下键和值的组合

例如(键):

(SL,SW) : < 1,5 > <  1,7 > < 3,5 > < 3,7 >
(SL,PL): < 1,11 > < 1,12 > < 3,11 > < 3,12 >
(SL,PW): < 1,16 > < 3,16 >
(SW,PL): < 5,11 > < 5,12 > < 7,11 > < 7,12 >
(SW,PW): < 5,16 > < 7,16 >
(PL,PW): < 11,16 > < 12,16 >

Consider combination of three attributes:

(SL,SW,PL): < 1,5,11 > < 1,5,12 > < 1,7,11 > < 1,7,12 > < 3,5,11 > < 3,5,12 > < 3,7,11 > < 3,7,12 >
(SL,SW,PW): < 1,5,16 > < 1,7,16 > < 3,5,16 > < 3,7,16 >
(SL,PL,PW): < 1,11,16 > < 1,12,16 > < 3,11,16 > < 3,12,16 >
(SW,PL,PW): < 5,11,16 > < 5,12,16 > < 7,11,16 > < 7,12,16 >

到目前为止,我只能为键创建组合。但这包括我不需要的 SL SL,我还需要获取我之前提到的值组合。

public void GenCombinations(String[] str_arr) {
    for (int i = 0; i < str_arr.length; i++) {
        System.out.print(str_arr[i] + " ");
    }

    /*COMBINATIONS OF LENGTH ONE*/
    for (int i = 0; i < str_arr.length; i++) {
        System.out.println(str_arr[i]);
    }        

    /*COMBINATIONS OF LENGTH TWO*/
    for (int i = 0; i < str_arr.length; i++) {
        for (int j = 0; j < str_arr.length; j++) {
            System.out.println(str_arr[i] + " " + str_arr[j]);
        }
    } 

    /*COMBINATIONS OF LENGTH THREE*/
    for (int i = 0; i < str_arr.length; i++) {
        for (int j = 0; j < str_arr.length; j++) {
            for (int k = 0; k < str_arr.length; k++) {
                System.out.println(str_arr[i] + " " + str_arr[j] + " " + str_arr[k]);
            }
        }
    }
}

电流输出

SL
SW
PL
PW
SL SL
SL SW
SL PL
SL PW
.
.
.

如何达到所需的输出以获取值的组合以及键的组合

请提出建议。

【问题讨论】:

    标签: java arrays combinations


    【解决方案1】:

    您可以检查索引:

    for(int i = 0; i < str_arr.length; i++) {
      for(int j = 0; j < str_arr.length; j++) {
        if (i != j) {
          System.out.println(str_arr[i] + " " + str_arr[j]);    
        }               
      }
    } 
    

    ,或者进行字符串比较:

    for(int i = 0; i < str_arr.length; i++) {
      for(int j = 0; j < str_arr.length; j++) {
        if (!str_arr[i].equals(str_arr[j]) {
          System.out.println(str_arr[i] + " " + str_arr[j]);    
        }               
      }
    } 
    

    【讨论】:

      【解决方案2】:

      初始化j = i+1k = j+1怎么样?

      public void GenCombinations(String[] str_arr){
          /*COMBINATIONS OF LENGTH TWO*/
          for(int i=0;i<str_arr.length;i++)
          {
              for(int j=i+1;j<str_arr.length;j++)
              {
                  System.out.println(str_arr[i]+" "+str_arr[j]);                   
              }
          } 
      
          /*COMBINATIONS OF LENGTH THREE*/
          for(int i=0;i<str_arr.length;i++)
          {
              for(int j=i+1;j<str_arr.length;j++)
              {
                  for(int k=j+1;k<str_arr.length;k++)
                  {  
                      System.out.println(str_arr[i]+" "+str_arr[j]+" "+str_arr[k]);                      
                  }
              }
          }
      }
      

      编辑:如果你想生成所有组合,你可能想递归地做

      private static void GenCombinations(String[] head, String[] tail, int headIndex, int tailIndex) {
          if (headIndex == head.length) {
              System.out.println(Arrays.toString(head));
              return;
          }
          if (tailIndex >= tail.length)
              return;
      
          // Either take tail[tailIndex] to head[headIndex]
          head[headIndex] = tail[tailIndex];
          GenCombinations(head, tail, headIndex+1, tailIndex+1);
      
          // Or don't take it, and try the next element to put in head[headIndex]
          GenCombinations(head, tail, headIndex, tailIndex+1);
      }
      
      private static void GenCombinations(String[] str_arr, int num) {
          GenCombinations(new String[num], str_arr, 0, 0);
      }
      
      private static void GenCombinations(String[] str_arr) {
          for (int i = 1; i <= str_arr.length; i++)
              GenCombinations(str_arr, i);
      }
      

      【讨论】:

      • 是的,现在它以正确的方式获取键,但是如何生成其值的组合?
      • 你如何保持你的价值观?数组或列表或其他东西?您需要提供更多代码。
      • 基本上,这个想法是:不是打印出键,而是使用它们来索引您的值。例如,使用两个键,您将拥有两个值数组。循环它们以获得所有可能的组合。
      • 值作为数组。我从文件中读取它并将它们存储到数组中
      • 如果我有更多键,如何获得长度为 4 的组合。我是否需要再次循环?如何全部自动生成?
      猜你喜欢
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 2019-08-02
      • 2021-07-16
      • 1970-01-01
      • 2019-02-06
      相关资源
      最近更新 更多