两个数组的递归组合项(不为空或重复),使用 Java

Posted

技术标签:

【中文标题】两个数组的递归组合项(不为空或重复),使用 Java【英文标题】:Recursive Combinations Items of Two Arrays (not null or repeated), using Java 【发布时间】:2018-04-12 21:59:03 【问题描述】:

我有两个数组(长度相同),大小是可变的。

做一个最简单的例子,我有两个长度为 3 的数组。

Persons -> P1, P2, P3
Seats -> Sa, Sb, Sc

我需要生成所有组合Cn

如果人P1Sa, 有可能:

P2 接受Sb 然后P3 将接受Sc。组合将是P1Sa, P2Sb, P3Sc。 或人P2Sc 然后P3 将取Sb。组合将是P1Sa, P2Sc, P3Sb

现在在这里所有可能的组合。

C0 -> P1Sa, P2Sb, P3Sc
C1 -> P1Sa, P2Sc, P3Sb
C2 -> P1Sb, P2Sa, P3Sc
C3 -> P1Sb, P2Sc, P3Sa
C4 -> P1Sc, P2Sa, P3Sb
C5 -> P1Sc, P2Sb, P3Sa

这是我糟糕的设计。

  private void recursiveSeatPerson(String c, List<String> p, List<String> s) 
    if (p.size() > 1) 
      for (int i = 0; i < s.size(); i++) 
        String combination = p.get(0)+s.get(i) + ", " + c;
        System.out.print(combination);

        List<String> new_s = new ArrayList<>();
        for (int index_s = 0; index_s < s.size(); index_s++) 
          if (index_s != i) 
            new_s.add(s.get(i));
          
        
        List<String> new_p = new ArrayList<>();
        for (int index_p = 1; index_p < p.size(); index_p++) 
          new_p.add(p.get(index_p));
        

        recursiveSeatPerson(combination, new_p, new_s);

      
     else 
      System.out.print(c + p.get(0)+s.get(0) + " ");
      System.out.println();
    
  

这是我的测试。

List<String> persons = Arrays.asList("P1", "P2", "P3");
List<String> seats = Arrays.asList("Sa", "Sb", "Sc");
recursiveSeatPerson("", persons, seats);

这是我的结果:

P1Sa, P2Sa, P1Sa, P2Sa, P1Sa, P3Sa 
P2Sa, P1Sa, P2Sa, P1Sa, P3Sa 
P1Sb, P2Sb, P1Sb, P2Sb, P1Sb, P3Sb 
P2Sb, P1Sb, P2Sb, P1Sb, P3Sb 
P1Sc, P2Sc, P1Sc, P2Sc, P1Sc, P3Sc 
P2Sc, P1Sc, P2Sc, P1Sc, P3Sc 

现在在这一行中发送类似空字符串的参数:

recursiveSeatPerson("", new_p, new_s);

这是糟糕的结果(再次)。

P1Sa, P2Sa, P3Sa 
P2Sa, P3Sa 
P1Sb, P2Sb, P3Sb 
P2Sb, P3Sb 
P1Sc, P2Sc, P3Sc 
P2Sc, P3Sc 

如何解决我的代码?

【问题讨论】:

***.com/questions/32438350/… Python merging two lists with all possible permutations的可能重复 谢谢,但是:我在等伪代码,把它传给Java,但由于我从来没有接触过python,所以我不明白算法的逻辑。由于使用 Java 对我的问题进行了更改,因此 Python 中的答案不适用。 【参考方案1】:

工作代码:

private void recursiveSeatPerson(String snippet, List<String> p, List<String> s) 
  if (p.size() > 1) 
    for (int i = 0; i < s.size(); i++) 
      String combination = snippet + p.get(0) + s.get(i) + ", ";

      List<String> new_s = new ArrayList<>();
      for (int index_s = 0; index_s < s.size(); index_s++) 
        if (index_s != i) 
          new_s.add(s.get(index_s));
        
      
      List<String> new_p = new ArrayList<>();
      for (int index_p = 1; index_p < p.size(); index_p++) 
        new_p.add(p.get(index_p));
      
      recursiveSeatPerson(combination, new_p, new_s);
    
   else 
    System.out.println(snippet + p.get(0)+s.get(0) + " ");
  

使用 4 个长度的数组进行测试。

List<String> persons = Arrays.asList("P1", "P2", "P3", "P4");
List<String> seats = Arrays.asList("Sa", "Sb", "Sc", "Sd");
recursiveSeatPerson("", persons, seats);

检查输出:

P1Sa, P2Sb, P3Sc, P4Sd 
P1Sa, P2Sb, P3Sd, P4Sc 
P1Sa, P2Sc, P3Sb, P4Sd 
P1Sa, P2Sc, P3Sd, P4Sb 
P1Sa, P2Sd, P3Sb, P4Sc 
P1Sa, P2Sd, P3Sc, P4Sb 
P1Sb, P2Sa, P3Sc, P4Sd 
P1Sb, P2Sa, P3Sd, P4Sc 
P1Sb, P2Sc, P3Sa, P4Sd 
P1Sb, P2Sc, P3Sd, P4Sa 
P1Sb, P2Sd, P3Sa, P4Sc 
P1Sb, P2Sd, P3Sc, P4Sa 
P1Sc, P2Sa, P3Sb, P4Sd 
P1Sc, P2Sa, P3Sd, P4Sb 
P1Sc, P2Sb, P3Sa, P4Sd 
P1Sc, P2Sb, P3Sd, P4Sa 
P1Sc, P2Sd, P3Sa, P4Sb 
P1Sc, P2Sd, P3Sb, P4Sa 
P1Sd, P2Sa, P3Sb, P4Sc 
P1Sd, P2Sa, P3Sc, P4Sb 
P1Sd, P2Sb, P3Sa, P4Sc 
P1Sd, P2Sb, P3Sc, P4Sa 
P1Sd, P2Sc, P3Sa, P4Sb 
P1Sd, P2Sc, P3Sb, P4Sa 

【讨论】:

以上是关于两个数组的递归组合项(不为空或重复),使用 Java的主要内容,如果未能解决你的问题,请参考以下文章

选择 mongoid 中不为空或为空的位置

检查所有三列是不是不为空或为空

如何判断int类型为空或null

在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?

如果STRING_AGG不为空或NULL,则将CONCAT / CONCAT_WS与STRING_AGG一起使用字符串来结果?

在查询SQL语句中为空或不为空怎么写