我正在研究排列。我找到了这个算法,但我不完全理解数组列表中发生了什么。我尝试使用String数组重写它但是不成功。
public static ArrayList<String> combinations(String nChars, int k)
{
int n = nChars.length();
ArrayList<String> combos = new ArrayList<String>();
if (k == 0)
{
combos.add("");
return combos;
}
if (n < k || n == 0)
return combos;
String last = nChars.substring(n-1);
combos.addAll(combinations(nChars.substring(0, n-1), k));
for (String subCombo : combinations(nChars.substring(0, n-1), k-1))
combos.add(subCombo + last);
return combos;
}
public static void main(String[] args)
{
String nChars = "ABCDEF";
System.out.println(combinations(nChars, 4));
}
提供的代码使用ArrayList而不是经典的String [](String数组),因为ArrayLists具有动态大小以及附加,更改和删除元素的便捷方法,而不必担心超出数组的大小。如果您想了解更多信息,请参阅ArrayLists的Java文档。
使用vanilla数组替换ArrayList时出错的原因是因为数组本身没有ArrayList定义的方法(例如combos.add(subCombo + last);
)。如果要将ArrayList替换为数组,则必须手动执行相应的操作。
编辑:我是一个白痴,没有读过问题标题。虽然从技术上讲可以使用String数组重写它,但是我们需要知道我们可以为combos
数组添加多少种可能的组合,这样我们就可以分配适当的空间量(即String[] combos = new String[num]
)。计算num
要么繁琐,要么为阵列分配太多空间,耗尽不必要的内存量。最好将内存管理留给ArrayList,并担心大部分时间手头的实际问题。
combos.addAll(组合(nChars.substring(0,n-1),k));
此调用显示了List接口的数组和实现之间的主要区别
换句话说:要重写代码以使用纯数组,您必须跟踪数组的当前大小,并且当您添加新条目时,您必须增加数组的大小。通过执行ArrayList为您隐式执行的所有操作:分配新数组,复制所有旧条目,然后最终添加您要添加的新数组。