像电子表格一样在Java中增加超过'Z'的字符

时间:2013-12-08 20:03:22

标签: java char spreadsheet

我很久以前没有开始编程,目前我需要一个方法来生成一个数组,其中包含一个字符,该字符位于前一个字符之后。它应该以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 ......“

怎么了?或者有更有效或更简单的方法吗?

提前致谢!

3 个答案:

答案 0 :(得分:4)

你有一个愉快的开始。此示例基本上不是通过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;
}

答案 1 :(得分: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)。

答案 2 :(得分:1)

此解决方案适合我。有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...

来自数组迭代,具体取决于您的要求