A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 北冥有鱼 中级黑马   /  2014-4-2 02:44  /  2695 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

把以下IP存入一个txt文件,编写程序把这些IP按数值大小,从小到达排序并打印出来。
                61.54.231.245
                61.54.231.9
                61.54.231.246
                61.54.231.48
                61.53.231.249

方法:1、IP地址取值0~255,可以将其看作一个四位的256进制数。a.b.c.d=a*256^3+b*256^2+c*256+d,比较转换后的数即可

下面是我的代码:
  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.util.ArrayList;
  7. import java.util.Comparator;
  8. import java.util.List;
  9. import java.util.Collections;

  10. public class Demo {

  11.         public static void main(String[] args) {
  12. //                定义文件地址
  13.                 File file=new File("D:\\test\\exam\\source\\IP.txt");
  14. //                创建集合,读取文件内容存入集合,每一行字符串存作一个元素
  15.                 List<String> list=new ArrayList();
  16.                 BufferedReader bufr=null;
  17.                 try {
  18.                         bufr=new BufferedReader(new FileReader(file));
  19.                         String line=null;
  20.                         while ((line=bufr.readLine())!=null) {
  21.                                 list.add(line);
  22.                         }
  23.                 } catch (FileNotFoundException e) {
  24.                         // TODO Auto-generated catch block
  25.                         e.printStackTrace();
  26.                 } catch (IOException e) {
  27.                         // TODO Auto-generated catch block
  28.                         e.printStackTrace();
  29.                 }finally{
  30. //                        关闭流
  31.                         if (bufr!=null) {
  32.                                 try {
  33.                                         bufr.close();
  34.                                 } catch (IOException e) {
  35.                                         // TODO Auto-generated catch block
  36.                                         e.printStackTrace();
  37.                                 }
  38.                         }
  39.                 }
  40. //                调用比较器排序
  41.                 Collections.sort(list, new Mycomparator());
  42. //                遍历输出排序后结果
  43.                 for (String string : list) {
  44.                         System.out.println(string);
  45.                 }
  46.         }

  47. }
  48. //自定义的比较器
  49. class Mycomparator implements Comparator<String>{

  50.         @Override
  51.         public int compare(String o1, String o2) {
  52.                 // TODO Auto-generated method stub
  53.                 int number1=toNumber(o1);
  54.                 int number2=toNumber(o2);
  55.                 return number1-number2;
  56.         }
  57. //        对IP地址分割,看作256进制的四位数,转化成十进制数的方法
  58.         private int toNumber(String o) {
  59.                 String[] str=o.split(".");
  60.                 int sum = 0;
  61. //                问题出在这里,下面我对分割后的数组打印其长度,值全都是0
  62. //                System.out.println(str.length);
  63.                 for (int i = 0; i < str.length; i++) {
  64.                         sum=sum*256+Integer.parseInt(str[i]);
  65.                 }
  66.                 return sum;
  67.         }
  68.        
  69. }
复制代码

问题出在比较器这边,最后一行的注释说明了。。。歇菜,看不出哪有问题


评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

5 个回复

倒序浏览
String[] str=o.split("."); //这里的点 代表任意字符改成 \\. 才代表点

其他的自己再看看吧
回复 使用道具 举报
毕老师的视频里也涉及到了这样的问题,你看了的话就应该知道,.在正则表达式中有特殊的含义,需要使用转义字符将其转义,向说的那样你使用\\.切割再试试看。
回复 使用道具 举报
String[] str=o.split(".");
改成
String[] str=o.split("\\.");
因为split最终调用的还是正则。正则里面表示点应该是\.
在java里面就应该“\\.”。\在java的字符串里面也需要用\转义
回复 使用道具 举报
leon_hm 发表于 2014-4-2 09:54
String[] str=o.split(".");
改成
String[] str=o.split("\\.");

哦,原来是这个原因。我没看过正则表达式。。。。。。。。。。。。补上先。   thanks
回复 使用道具 举报
改了 也不行呢,什么问题呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马