java - 从整数索引中获取字母

标签 java string

我希望有一个 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, Stringintegers 因为在学校我们不能升级 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/

相关文章:

java - 重写 equals() 方法以检查共享继承的对象中的维度相等性

java - 如何使用 HIVE JDBC 驱动程序在列名中使用特殊字符?

Java replaceAll/用美元符号实例替换字符串

python - 将字符串视为整数

c# - 如何将字符串拆分为有效的方式c#

java - 如何返回带有消息的响应,jax rs

java - 一个 HashMap ,其中值对象的字段是键?

Java:如何用不同的方法获取数组的长度?

C函数输入字符串

c - 如何正确比较 C 中的字符串?