我正在研究排列。我找到了这个算法,但是我不完全了解数组列表中正在发生的事情。我尝试使用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));
}
答案 0 :(得分:3)
提供的代码在经典的String [](字符串数组)上使用了ArrayList,因为ArrayLists具有动态大小以及方便的方法来添加,更改和删除元素,而不必担心超出数组的大小。如果您想了解更多信息,请参见ArrayLists的Java文档。
在使用普通数组替换ArrayList时出错的原因是,数组本身没有ArrayList定义的任何方法(例如combos.add(subCombo + last);
)。如果要用数组替换ArrayList,则必须手动执行相应的操作。
编辑:我是个白痴,没有阅读问题标题。从技术上说,可以使用String数组重写此数组,但它需要我们知道我们可以向combos
数组中添加多少种可能的组合,以便我们可以分配适当的空间量(即{{1} }。计算String[] combos = new String[num]
可能很繁琐,或者会占用过多的内存,从而为阵列分配过多的空间。最好将内存管理留给ArrayList,并在大多数时候担心手头的实际问题。
答案 1 :(得分:0)
combos.addAll(combinations(nChars.substring(0,n-1),k));
此调用显示了数组与List接口的实现之间的主要区别
换句话说:要重写您的代码以使用纯数组,您必须跟踪数组的当前大小以及添加新条目时的情况。您必须增加阵列的大小。通过完成ArrayList隐式为您做的所有事情:分配一个新数组,复制所有旧条目,然后最终放入要添加的新条目。