我希望有一个 java 方法,它给我一个给定的索引,一个相应的字母集 excel,所以:
258 => IZ(最后一个索引)
30 => 广告
120 => 恢复
56 => 屋宇署
第一种方法给出了正确的输出,但它非常愚蠢,我不喜欢那样。 我试图建立第二种涉及一些思考的方法。 我已经看到使用 String Builder 或其他类似 this one 的方法 但我尝试自己构建一个方法,也就是 betterGetColumnName。
更好的 258 => IHGFEDCBAX(不正常)
更好的 30 => AD(好的,第二个字母表没问题)
更好的 120 => DCBAP(不好)
更好的 56 => 糟糕(似乎第 3 轮字母表打破了我的逻辑)
public String getColumnName(int index){
String[] letters = {
"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","AA","AB","AC","AD","AE","AF","AG","AH",
"AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV",
"AW","AX","AY","AZ","BA","BB","BC","BD","BE","BF","BG","BH","BI","BJ",
"BK","BL","BM","BN","BO","BP","BQ","BR","BS","BT","BU","BV","BW","BX",
"BY","BZ","CA","CB","CC","CD","CE","CG","CH","CI","CJ","CK","CL","CM",
"CN","CO","CP","CQ","CR","CS","CT","CU","CV","CW","CX","CY","CZ","DA",
"DB","DC","DD","DF","DG","DH","DI","DJ","DK","DL","DM","DN","DO","DP",
"DQ","DR","DS","DT","DU","DV","DW","DX","DY","DZ","EA","EB","EC","ED",
"EE","EF","EG","EH","EI","EJ","EK","EL","EM","EN","EO","EP","EQ","ER",
"ES","ET","EU","EV","EW","EX","EY","EZ","FA","FB","FC","FD","FE","FF",
"FG","FH","FI","FJ","FK","FL","FM","FN","FO","FP","FQ","FR","FS","FT",
"FU","FV","FW","FX","FY","FZ","GA","GB","GC","GD","GE","GF","GG","GH",
"GI","GJ","GK","GL","GM","GN","GO","GP","GQ","GR","GS","GT","GU","GV",
"GW","GX","GY","GZ","HA","HB","HC","HD","HE","HF","HG","HH","HI","HJ",
"HK","HL","HM","HN","HO","HP","HQ","HR","HS","HT","HU","HV","HW","HX",
"HY","HZ","IA","IB","IC","ID","IE","IF","IG","IH","II","IJ","IK","IL",
"IM","IN","IO","IP","IQ","IR","IS","IT","IU","IV","IW","IX","IY","IZ"
};
if (index<=letters.length){
return letters[index-1];
}else{
return null;
}
}
我想我应该保存我做了一个完整的字母轮的次数,我不会使用 StringBuilder
否则,只是 char
, String
和 integers
因为在学校我们不能升级 java 版本 (1.5.x) 我也认为这可能对我理解为什么我的逻辑如此错误很有用。
public String betterGetColumnName(int index){
int res=0;
String s = "";
char h='0';
while(index>26){
res=index/26;
h=(char)(res+64);
s+=h;
index -=26;
}
h=(char)(index+64);
s+=h;
return s;
}
最佳答案
虽然您的逻辑有点不对,但您绝对是在正确的轨道上。您实际上要做的是将以 10 为基数的整数转换为以 26 为基数的字符。但转换后的“数字”实际上由 26 个字母组成,而不是数字。
此处您想要的算法是通过将输入数字除以 26 的余数来确定输出的每个字母。然后,将输入除以 26 并再次检查“十位”位置以查看它是什么字母。在下面的代码片段中,我假设 1 对应于 A
,26 对应于 Z
,27 对应于 AA
。您可以按您认为最好的方式移动索引。
int input = 53;
String output = "";
while (input > 0) {
int num = (input - 1) % 26;
char letter = (char)(num+65);
output = letter + output;
input = (input-1) / 26;
}
System.out.println(output);
BA
Demo
注意:建议使用 StringBuilder
而不是 String
进行连接,这是一个有用的编辑。虽然这可能比上面的代码更优化,但它可能会使算法更难理解。
关于java - 从整数索引中获取字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48421261/