Java中如何像电子表格一样递增字符超过 'Z'

4

我不久前开始学习编程,现在需要一个方法来生成一个包含字符的数组,该字符是在先前字符之后出现的。它应该从0处开始以'A'开头,然后在'1'处是'B'等等。困难的部分是使其在'Z'之后变成'AA'。

我的解决方案:

public static String[] charArray(int length)
{   
    String[] res = new String[length];
    for(int i = 0; i < length; i++)
    {
        String name = "";
        int colNumber = i;
        while(colNumber > 0)
        {
            char c = (char) ('A' + (colNumber % 26));
            name = c + name;
            colNumber = colNumber / 26;
        }
        res[i] = name;
    }
    return res;
}

这对于字母表前26个字母有效,但它会产生“...Y,Z,BA,BB,BC...”而不是“...Y,Z,AA,AB,AC...”。出了什么问题?或者有更有效或更简单的方法来做到这一点吗?谢谢!

要弄清楚为什么会得到你正在获取的输出,你只需要花几分钟思考你的变量。也许可以打印一些额外的信息。 - keyser
3个回答

5
你有一个不错的开始。这个例子不是通过 while 循环来运行,而是基于数字 % 26 计算 C 的值。
然后将字母添加(连接)到数组中位置的值上:(index / 26) - 1,这样可以确保它随着时间的推移保持更新。
在第一次迭代时,每个槽位中只有一个字母,如A B C等。
当你遍历完整个字母表后,就会得到一个反向的索引,并将当前字母添加到该值中。
最终你会得到 AAA AAB AAC 等等。
    public static String[] colArray(int length) {   

    String[] result = new String[length];

    String colName = "";
    for(int i = 0; i < length; i++) {

        char c = (char)('A' + (i % 26));
        colName = c + "";
        if(i > 25){
            colName =  result[(i / 26) - 1] + "" + c;
        }
        result[i] = colName;
    }
    return result;
}

这正好按照预期工作。非常感谢你的帮助! - Emiel
@Emiel 没问题。如果这对您有用,请务必接受答案。在这里,接受答案与提问一样重要。=] - leigero

2

这个解决方案对我很有用。由于有26个字母表,并且知道65是ASCII表中的字符'A',我们可以使用这个递归方法来进行增量操作...

private fun indexLetters(index: Int, prefix: String = "") : String {
    val indexSuffix:Int = index.rem(26)
    val suffix = (65 + indexSuffix).toChar().toString().plus(".")
    val newPrefix = suffix.plus(prefix)

    val indexPrefix: Int = index / 26
    return if (indexPrefix > 0) {
        indexLetters(indexPrefix - 1, newPrefix)
    } else {
        newPrefix
    }
}

您可以像这样调用kotlin方法:
indexLetters(0) //To get an 'A'
indexLetters(25) //To get a 'Z'
indexLetters(26) //To get an 'A.A'
etcetera...

根据您的需求,从数组迭代中选择


2

试试这样做:

public static String[] charArray(int length)
{   
    String[] res = new String[length];
    int counter = 0;
    for(int i = 0; counter < length; i++)
    {
        String name = "";
        int colNumber = i;
        while(colNumber > 0 && colNumber % 27 != 0)
        {  
            char c = (char) ('A' + ((colNumber) % 27) - 1);
            name = c + name;
            colNumber = colNumber / 27;
        }
        res[counter] = name;

        if (i % 27 != 0) {
            counter++;
        }
    }
    return res;
}

基本上,您的算法跳过了所有以A开头的元素(A、AA、AB等)(因为当colNumber为0时创建了一个A,但由于while在这种情况下终止,所以这从未发生)。取27的模数,然后实际上从char中减去1可以解决此问题。然后,我们使用counter作为索引,否则我们将在数组中得到一些空元素(其中i将是i%27 == 0的情况)。

@RichardTingle 你是对的。我们必须执行for循环,直到i等于length而不是直到我们的索引counter等于长度为止。我进行了编辑,现在应该可以正常工作。 - Blub
1
在值ZZ之后,这也不起作用。它会打印字母,然后在进入三位数之前做一些奇怪的事情。 - leigero
这正如预期的那样发挥作用。非常感谢您的帮助! - Emiel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接