黑马程序员技术交流社区

标题: Java编程-进制转换-Excel单元格地址之间的转换 [打印本页]

作者: 熊娜    时间: 2014-4-22 19:33
标题: Java编程-进制转换-Excel单元格地址之间的转换

Excel 单元格地址有两种格式:

普通格式,如:A5, BC12

对应的RC格式:R5C1, R12C55

显然,RC格式是直接给出行号和列号

请编程在两种地址格式间转换。

这道题是对Java蓝桥杯中的一道题进行的扩展,首先需要找出两种格式之间的关系,通过观察可以发现,A5-->R5C1,A表示的是列号1(A,B,C......Z分别代表1,2,3......26),5代表行号5,BC代表的是列号是2×26+3=55,12代表行号12,所以BC12-->R12C55,这道题实质上就是一道进制转换的题,关键在于BC和55之间的转换。

下面附上我写的代码:

package class2;

public class C {

public static void main(String[] args) {

    String s1="R12C55";

    String s2="BC12";

    func1(s2);//BC12-->R12C55

    func2(s1);//R12C55-->BC12

        }

    public static void func1(String s){  //BC12-->R12C55

            int row=0;

            int col=0;

            for(int i=0;i<s.length();i++){

                     char c=s.charAt(i);

                     if(c>='A'&&c<='Z'){

                             col=col*26+(c-'A'+1);

                     }else{

                             row=row*10+(c-'0');

                     }          

            }

            System.out.println("R"+row+"C"+col);

    }

    public static void func2(String s){  //R12C55-->BC12

            int row=0;

            int col=0;

            int a=s.indexOf('R');

            int b=s.indexOf('C');

            for(int i=a+1;i<b;i++){

               char c=s.charAt(i);

               row=row*10+(c-'0');    //得到行号

            }

            for(int j=b+1;j<s.length();j++){

                    char c=s.charAt(j);

                    col=col*10+(c-'0');   //得到列号

            }

            String s2="";

            for(;;){

                    if(col==0) break;

                    s2=(char) ('A'+col%26-1)+s2;

                    col/=26;

            }

            System.out.println(s2+row);

    }

}




作者: 许庭洲    时间: 2014-4-24 20:45
值得学习ing!
作者: 熊娜    时间: 2014-4-24 21:25
许庭洲 发表于 2014-4-24 20:45
值得学习ing!

呵呵,你的技术分都759了~我还是新手,如果这篇帖子真的有你可以学习的地方,我很开心啊~
作者: 熊娜    时间: 2014-4-25 13:25
前几天写的这道题代码有个bug,比如输入R12C52,得到的不是AZ12,而是B@12,需要得到正确的结果需要将以下代码:
    for(;;){
                    if(col==0) break;
                    s2=(char) ('A'+col%26-1)+s2;
                    col/=26;
            }
改为:
   for(;;){
                     if(col==0) break;
                     s2=(char) ('A'+(col-1)%26)+s2;
                     col=(col-1)/26;
            }
我们写代码的时候一定要考虑到各种情况,才能写出没有漏洞的代码~
作者: 酱油炒饭    时间: 2014-4-26 00:03
学习学习的榜样啊~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2