如何将整数转换为 A1 表示法?
How can I convert an integer to A1 notation?
我正在尝试创建一种方法来查找给定列之后的下一列。例如:
input: A
output: B
乍一看似乎很简单。我正打算使用以下方法:
public static char nextLetter(char c) {
c++;
return c;
}
当你越过 Z 列时,问题就出现了。在 Google 表格中,Z 列之后,列名是两个字母,然后是三个字母,等等。所以在 Z
列之后是 AA
,AZ
之后是BA
,ZZ
之后是AAA
,等等。我接下来的想法是首先根据索引找出列位置。所以 AA
列将是 27,BA
52,等等
查找列的索引不是我现在面临的问题。我需要弄清楚如何将该索引转换为相应的列名。我本来打算尝试以下方法,但我意识到它也仅限于 A-Z:
public static char getLetter(int index) {
return (char) (index + 64);
}
此时,我在想需要一个递归的方法。但是,我不知道要设置它。据我所知:
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
}
}
有谁知道将整数(索引)转换为对应列名的好方法吗?
编辑
我刚刚在 Github 上找到了一个非常有用的资源,它处理六维数:https://gist.github.com/pinguet62/9817978
试一试
private static String getNotation(int size) {
String result = "";
int q = 0; // How many characters does the notation consist of?
int f1 = 0;
int f2 = 0;
while (f2 < size) {
q += 1;
f1 = f2;
f2 += Math.pow(26, q);
}
size -= f1;
size--;
for (int i = 0; i < q; i++) {
result = (char) (size % 26 + 65) + result;
size /= 26;
}
return result;
}
我创建了一个例子:
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));
}
}
}
以上将产生如下结果:
0: A
1: B
2: C
3: D
...
24: Y
25: Z
26: AA
27: AB
...
700: ZY
701: ZZ
702: AAA
703: AAB
...
在这种情况下,它是零索引,但您可以轻松更改自己。
我想像六进制(16 进制)一样,您可以使用 26 进制。可以尝试使用 10 进制到 X 进制的转换器。
主要问题是,在这种情况下,在 "number" "Z" 之后你有数字 "AA" 就像在数字 9 之后你将有 00。或者在六边形中,如果在 F 之后你有 00 而不是 10。
我自己尝试了很多,但终于找到了这个主题:
How to convert a column number (eg. 127) into an excel column (eg. AA)
在 Java 中:
private static String getNotation(int size) {
str = "";
int r;
while(size >0) {
r = (size-1) % 26;
str = getLetter(r+1)+ str;
size = (size-r) /26 ;
}
return str;
}
似乎解决方案只是模数附近的 -1,如果删除它,您会将 A 视为 0,因此在 Z 之后将有 BA,如十进制到基数 26 的转换器。
您可以按照以下方式进行:
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();
}
}
输出:
B
AA
AB
BA
ZB
AAA
AAB
ABB
ACA
AAAA
昨天我需要在 Go 中将整数转换为 A1 表示法,所以我制作了 this 递归函数(移植到 java 以匹配问题标签):
public static String indexToA1Notation(int column) {
if (column <= 'Z' - 'A') {
return Character.toString('A' + column);
}
return String.format("%s%s", indexToA1Notation((column/26)-1), Character.toString('A'+column%26));
}
我正在尝试创建一种方法来查找给定列之后的下一列。例如:
input: A
output: B
乍一看似乎很简单。我正打算使用以下方法:
public static char nextLetter(char c) {
c++;
return c;
}
当你越过 Z 列时,问题就出现了。在 Google 表格中,Z 列之后,列名是两个字母,然后是三个字母,等等。所以在 Z
列之后是 AA
,AZ
之后是BA
,ZZ
之后是AAA
,等等。我接下来的想法是首先根据索引找出列位置。所以 AA
列将是 27,BA
52,等等
查找列的索引不是我现在面临的问题。我需要弄清楚如何将该索引转换为相应的列名。我本来打算尝试以下方法,但我意识到它也仅限于 A-Z:
public static char getLetter(int index) {
return (char) (index + 64);
}
此时,我在想需要一个递归的方法。但是,我不知道要设置它。据我所知:
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
}
}
有谁知道将整数(索引)转换为对应列名的好方法吗?
编辑
我刚刚在 Github 上找到了一个非常有用的资源,它处理六维数:https://gist.github.com/pinguet62/9817978
试一试
private static String getNotation(int size) {
String result = "";
int q = 0; // How many characters does the notation consist of?
int f1 = 0;
int f2 = 0;
while (f2 < size) {
q += 1;
f1 = f2;
f2 += Math.pow(26, q);
}
size -= f1;
size--;
for (int i = 0; i < q; i++) {
result = (char) (size % 26 + 65) + result;
size /= 26;
}
return result;
}
我创建了一个例子:
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));
}
}
}
以上将产生如下结果:
0: A
1: B
2: C
3: D
...
24: Y
25: Z
26: AA
27: AB
...
700: ZY
701: ZZ
702: AAA
703: AAB
...
在这种情况下,它是零索引,但您可以轻松更改自己。
我想像六进制(16 进制)一样,您可以使用 26 进制。可以尝试使用 10 进制到 X 进制的转换器。 主要问题是,在这种情况下,在 "number" "Z" 之后你有数字 "AA" 就像在数字 9 之后你将有 00。或者在六边形中,如果在 F 之后你有 00 而不是 10。
我自己尝试了很多,但终于找到了这个主题: How to convert a column number (eg. 127) into an excel column (eg. AA)
在 Java 中:
private static String getNotation(int size) {
str = "";
int r;
while(size >0) {
r = (size-1) % 26;
str = getLetter(r+1)+ str;
size = (size-r) /26 ;
}
return str;
}
似乎解决方案只是模数附近的 -1,如果删除它,您会将 A 视为 0,因此在 Z 之后将有 BA,如十进制到基数 26 的转换器。
您可以按照以下方式进行:
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();
}
}
输出:
B
AA
AB
BA
ZB
AAA
AAB
ABB
ACA
AAAA
昨天我需要在 Go 中将整数转换为 A1 表示法,所以我制作了 this 递归函数(移植到 java 以匹配问题标签):
public static String indexToA1Notation(int column) {
if (column <= 'Z' - 'A') {
return Character.toString('A' + column);
}
return String.format("%s%s", indexToA1Notation((column/26)-1), Character.toString('A'+column%26));
}