两个数组的递归组合项(不为空或重复),使用 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
如果人P1
取Sa
,
有可能:
P2
接受Sb
然后P3
将接受Sc
。组合将是P1Sa, P2Sb, P3Sc
。
或人P2
取Sc
然后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的主要内容,如果未能解决你的问题,请参考以下文章
在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?
如果STRING_AGG不为空或NULL,则将CONCAT / CONCAT_WS与STRING_AGG一起使用字符串来结果?