gpt4 book ai didi

java - 可变数量的嵌套 For 循环

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:32:33 27 4
gpt4 key购买 nike

我正在用 Java 编写单词解读器。现在我有一个程序可以打印从一个有 3 个或更多字母的单词中选择的 3 个字母的所有重新排列(无重复)。因此,例如,如果参数是 abcd,它将打印:

[[abc, abd, acb, acd, adb, adc, bac, bad, bca, bcd, bda, bdc, cab, cad, cba, cbd, cda, cdb, dab, dac, dba, dbc, dca , 数据中心]]

我正在用排列填充二维数组列表。现在,二维数组内部只有一个数组,其中包含 3 个字母的排列。我希望二维数组具有用于排列 1 个字母、2 个字母、3 个字母等的数组,并在单词的长度处停止。问题是我需要可变数量的嵌套 for 循环来完成此操作。对于 3 个字母的排列,我有 3 个嵌套的 for 循环。每个循环遍历参数中的字母。

public static void printAllPermuations(String word)
{
int len = word.length();
ArrayList<String> lets = new ArrayList<String>();
//this array of letters allows for easier access
//so I don't have to keep substringing
for (int i = 0; i < len; i++)
{
lets.add(word.substring(i, i + 1));
}

ArrayList<ArrayList<String>> newWords = new ArrayList<ArrayList<String>>();
newWords.add(new ArrayList<String>());
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
{
for (int k = 0; k < len; k++)
{
if (i != j && i != k && j != k)
//prevents repeats by making sure all indices are different
{
newWords.get(0).add(lets.get(i) + lets.get(j) + lets.get(k));
}
}
}
}
System.out.println(newWords);
}

我看过其他帖子,听说递归可以解决这个问题。不过,我不知道我将如何实现。而且我也看到了一些我不明白的复杂解决方案。我要求的是可能的最简单 解决方案,无论它是否涉及递归。

最佳答案

使用递归方法,您可以将循环之一放入函数中,将循环参数传递给该函数。然后从函数的循环内调用它来嵌套另一个循环。

void loopFunction(ArrayList<ArrayList<String>> newWords, int level) {
if (level == 0) { // terminating condition
if (/* compare the indices by for example passing down a list with them in */)
{
newWords.get(...).add(...);
}
} else {// inductive condition
for (int i = 0; i < len; i++) {
loopFunction(newWords, level-1);
}
}
}

因此对于您的示例,您需要 3 个级别的递归,因此您将开始递归:

loopFunction(newWords, 3);

编辑

既然您遇到了麻烦,这里有一个可用的版本。它保留要比较的索引列表,并在进行时构建字符串。将重新排列的单词添加到每一层的二维数组中,得到所有长度的单词。使用递归,最容易从功能上思考而不是更改并保持变量不可变(不可更改)。尽管为了方便起见,我更新了 indices 而不是创建新副本,但这段代码主要是这样做的。

void loopFunction(ArrayList<String> lets, ArrayList<ArrayList<String>> newWords, int level, ArrayList<Integer> indices, String word) {
if (level == 0) { // terminating condition
return;
} else { // inductive condition
for (int i = 0; i < lets.size(); i++) {
if (!indices.contains(i)) { // Make sure no index is equal
int nextLevel = level-1;
String nextWord = word+lets.get(i);

newWords.get(level-1).add(nextWord);

indices.add(i);
loopFunction(lets, newWords, nextLevel, indices, nextWord);
indices.remove((Integer) i);
}
}
}
}

关于java - 可变数量的嵌套 For 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18165937/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com