我遇到了Java问题。
假设n是一个整数,我想创建一个StringBuffer数组,其中包含字母表中所有26 ^ n个字母组合,以及字典顺序。我获得了ArrayIndexOutOfBoundsException。
我写了这堂课:
public static StringBuffer[] creaTabellaTotale(int n, char[] a) {
StringBuffer[] tabella = new StringBuffer[ pow(26, n)];
for(int w =0; w < pow(26, n); w++)
tabella[w] = new StringBuffer("");
for(int h = 1; h <= n ; h++){
for(int u =0; u < pow ( 26, h-1); u++){
for (int j = 0; j<26; j++){
for( int x =pow(26, n-h+1)*u + pow(26, n-h)*j; x< pow(26, n-h+1)*u + pow(26, n-h)*(j+1); x++)
tabella[x] = tabella[x].append(a[j]);
}
}
}
return tabella;
}
这里a []是一个按字母顺序包含26个字母的数组;我重写了pow(),它的原型是int pow(int b,int e)。我无法找到错误。
答案 0 :(得分:3)
在上一个 for :
中for( int x =pow(26, n-h+1)*u + pow(26, n-h)*j; x< pow(26, n-h+1)*u + pow(26, n-h)*(j+1); x++)
tabella[x] = tabella[x].append(a[j]);
您尝试使用索引比数组访问阵列。你可能没有意识到,但 int x 在这里变得比你的数组更大:
x =pow(26, n-h+1)*u + pow(26, n-h)*j
修改强>
正如@d'large'cop在评论中所说:你的数学运算是错误的
答案 1 :(得分:1)
我建议使用递归而不是正常的迭代;代码更清晰,更短 - 更容易发现错误。
String[] alphabet = { "a", "b", "c", "d", "e", "f", "g",
"h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
"u", "v", "w", "x", "y", "z" };
final int amount = 26; //alphabet.size()
StringBuffer[] foo = new StringBuffer[pow(amount, n)];
long counter = 0;
public void recursion(int depth, StringBuffer actual)
{
String a = actual.toString();
for (int i = 0; i < amount; i++)
{
foo[counter++] = new StringBuffer(a + alphabet[i]);
if (depth != 1)
recursion(depth - 1, new StringBuffer(a + alphabet[i]));
}
}
只需致电recursion(n, "")
。