0

我对 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)。我找不到错误。

4

2 回答 2

3

在你的最后一个

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'alar'cop 在他的评论中所说:你的数学运算是错误的

于 2013-08-09T18:31:04.880 回答
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, "")

于 2013-08-09T18:41:30.573 回答