如何将整数转换为 A1 表示法?

Car*_*tem 5 java notation google-sheets-api

我正在尝试创建一种方法,可以在给定列之后找到下一列。例如:

input: A
output: B
Run Code Online (Sandbox Code Playgroud)

乍一看似乎很简单。我只是打算使用以下方法:

public static char nextLetter(char c) {
    c++;
    return c;
}
Run Code Online (Sandbox Code Playgroud)

当你过去Z列在谷歌表,列Z后,就会出现问题,列名是两个字母,然后是三个,等于是柱后Z谈到AA,后AZBA,后ZZAAA,等我的下一个念头,就是首先要弄清楚索引方面的列位置。所以列AA将是 27、52BA等。

查找列的索引不是我现在面临的问题。我需要弄清楚如何将该索引转换为相应的列名。我打算尝试以下方法,但我意识到它也仅限于 AZ:

public static char getLetter(int index) {
    return (char) (index + 64);
}
Run Code Online (Sandbox Code Playgroud)

在这一点上,我认为需要一种递归方法。但是,我无法弄清楚如何设置它。这是我得到的:

private static void getNotation(int size) {
    int divided = size / 26;
    int remainder = size % 26;

    String notation = "";

    while (divided % 26 > 0) {
        // Here is where the need for a recursive method comes in
    }

}
Run Code Online (Sandbox Code Playgroud)

有谁知道将整数(索引)转换为相应列名的好方法吗?

编辑

我刚刚在 Github 上找到了一个非常有用的资源,它处理了十六进制:https ://gist.github.com/pinguet62/9817978

kba*_*kba 7

我创建了一个示例:

class Test {
    static char[] 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' };

    private static String indexToColumnName(int i) {
        if (i >= alphabet.length) {
            return indexToColumnName((int)Math.floor(i / alphabet.length) - 1)
              + indexToColumnName(i % alphabet.length);
        }
        return Character.toString(alphabet[i]);
    }

    public static void main(String args[]) {
        for (int i = 0; i <= 800; ++i) {
            System.out.println(i + ": " + indexToColumnName(i));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以上将产生类似的东西:

0: A
1: B
2: C
3: D
...
24: Y
25: Z
26: AA
27: AB
...
700: ZY
701: ZZ
702: AAA
703: AAB
...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它是零索引,但您可以轻松更改自己。


Arv*_*ash 1

您可以按如下方式进行操作:

public class Main {
    public static void main(String[] args) {
        System.out.println(getNextColumn("A"));
        System.out.println(getNextColumn("Z"));
        System.out.println(getNextColumn("AA"));
        System.out.println(getNextColumn("AZ"));
        System.out.println(getNextColumn("ZA"));
        System.out.println(getNextColumn("ZZ"));
        System.out.println(getNextColumn("AAA"));
        System.out.println(getNextColumn("ABA"));
        System.out.println(getNextColumn("ABZ"));
        System.out.println(getNextColumn("ZZZ"));
    }

    static String getNextColumn(String column) {
        column = column.toUpperCase();
        StringBuilder sb = new StringBuilder();
        boolean allZ = true;
        for (int i = 0; i < column.length(); i++) {
            if (!(column.charAt(i) == 'Z')) {
                allZ = false;
                break;
            }
        }
        if (allZ) {
            for (int i = 0; i <= column.length(); i++) {
                sb.append('A');
            }
            return sb.toString();
        }
        boolean charAfterZ = false;
        int indexOfZ = 0;
        for (int i = 0; i < column.length() - 1; i++) {
            if (column.charAt(i) == 'Z') {
                charAfterZ = true;
                indexOfZ = i;
                break;
            }
        }
        if (charAfterZ) {
            sb.append(column.substring(0, indexOfZ + 1) + (char) (column.charAt(indexOfZ + 1) + 1));
            if (column.length() > indexOfZ + 2) {
                sb.append(column.substring(indexOfZ + 1));
            }
            return sb.toString();
        }

        char lastChar = column.charAt(column.length() - 1);

        if (lastChar == 'Z') {
            sb.append(column.substring(0, column.length() - 2) + (char) (column.charAt(column.length() - 2) + 1) + ""
                    + 'A');
        } else {
            if (column.length() > 1) {
                sb.append(column.substring(0, column.length() - 1) + ""
                        + (char) (column.charAt(column.length() - 1) + 1));
            } else {
                sb.append((char) (column.charAt(column.length() - 1) + 1));
            }
        }
        return sb.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

B
AA
AB
BA
ZB
AAA
AAB
ABB
ACA
AAAA
Run Code Online (Sandbox Code Playgroud)