黑马程序员技术交流社区
标题:
用自定义比较器对IP地址排序
[打印本页]
作者:
北冥有鱼
时间:
2014-4-2 02:44
标题:
用自定义比较器对IP地址排序
把以下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,比较转换后的数即可
下面是我的代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Collections;
public class Demo {
public static void main(String[] args) {
// 定义文件地址
File file=new File("D:\\test\\exam\\source\\IP.txt");
// 创建集合,读取文件内容存入集合,每一行字符串存作一个元素
List<String> list=new ArrayList();
BufferedReader bufr=null;
try {
bufr=new BufferedReader(new FileReader(file));
String line=null;
while ((line=bufr.readLine())!=null) {
list.add(line);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
// 关闭流
if (bufr!=null) {
try {
bufr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 调用比较器排序
Collections.sort(list, new Mycomparator());
// 遍历输出排序后结果
for (String string : list) {
System.out.println(string);
}
}
}
//自定义的比较器
class Mycomparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
int number1=toNumber(o1);
int number2=toNumber(o2);
return number1-number2;
}
// 对IP地址分割,看作256进制的四位数,转化成十进制数的方法
private int toNumber(String o) {
String[] str=o.split(".");
int sum = 0;
// 问题出在这里,下面我对分割后的数组打印其长度,值全都是0
// System.out.println(str.length);
for (int i = 0; i < str.length; i++) {
sum=sum*256+Integer.parseInt(str[i]);
}
return sum;
}
}
复制代码
问题出在比较器这边,最后一行的注释说明了。。。歇菜,看不出哪有问题
作者:
osully
时间:
2014-4-2 07:46
String[] str=o.split("."); //这里的点 代表任意字符改成 \\. 才代表点
其他的自己再看看吧
作者:
松毛
时间:
2014-4-2 07:56
毕老师的视频里也涉及到了这样的问题,你看了的话就应该知道,.在正则表达式中有特殊的含义,需要使用转义字符将其转义,向说的那样你使用\\.切割再试试看。
作者:
leon_hm
时间:
2014-4-2 09:54
String[] str=o.split(".");
改成
String[] str=o.split("\\.");
因为split最终调用的还是正则。正则里面表示点应该是\.
在java里面就应该“\\.”。\在java的字符串里面也需要用\转义
作者:
北冥有鱼
时间:
2014-4-2 15:40
leon_hm 发表于 2014-4-2 09:54
String[] str=o.split(".");
改成
String[] str=o.split("\\.");
哦,原来是这个原因。我没看过正则表达式。。。。。。。。。。。。补上先。 thanks
作者:
加油
时间:
2014-10-28 15:53
改了 也不行呢,什么问题呢?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2