黑马程序员技术交流社区
标题:
一个IP排序的入学测试题
[打印本页]
作者:
杨庆雷
时间:
2014-8-14 23:43
标题:
一个IP排序的入学测试题
/*
* 6、 把以下IP存入一个txt文件,编写程序把这些IP按数值大小,从小到达排序并打印出来。
*
* 61.54.231.245
* 61.54.231.9
* 61.54.231.246
* 61.54.231.48
* 61.53.231.249
*
* */
public class Test6 {
public static void main(String[] args){
//存放IP地址的相对路径
String str = ".\\src\\com\\itheima\\IP.txt";
//把IP地址以字符串的形式作为参数
List<String> list = printIP(str);
//把返回的ArrayLst的对象 list用自定义的比较器Mycomparator排序
Collections.sort(list,new Mycomparator());
//用迭代器把比较后的结果打印到控制台
Iterator<String> orderit = list.iterator();
while (orderit.hasNext()) {
System.out.println(orderit.next());
}
}
private static List<String> printIP(String str) {
//因为是纯文本文档此处可以用字符流,创建字符流缓冲对象,提高效率
BufferedReader bufr = null;
//创建ArrayList对象,用于存储Ip地址
List<String> list = new ArrayList<String>();
try {
//创建字符读取流加入缓存
bufr=new BufferedReader(new FileReader(str));
//读入的一行字符
String line=null;
while((line=bufr.readLine())!=null){
//每读取一行就存入list集合中
list.add(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//字符串数组
try {
if(bufr != null){
bufr.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
}
class Mycomparator implements Comparator<String>{
@Override
public int compare(String s1, String s2) {
//创建两个数组,用于存储切割后的IP
String[] arr1 = s1.split("\\.");
String[] arr2 = s2.split("\\.");
//定义两个用于存储IP地址计算后的Long值对象,因为数据比较大,超出了int的范围
long num1 = 0;
long num2 = 0;
for (int i = 0; i < arr1.length; i++) {
//因为每一段IP的最大值是256,每一段乘以256的3-i的次方,方便下面的比较
num1 = (long) (num1 + Integer.parseInt(arr1[i])*Math.pow(256,(3-i)));
}
for (int i = 0; i < arr2.length; i++) {
//因为每一段IP的最大值是256,每一段乘以256的3-i的次方,方便下面的比较
num2 = (long) (num2 + Integer.parseInt(arr2[i])*Math.pow(256,(3-i)));
}
//因为 num1-num2 的运算结果可能会超出int的范围,所以不能直接返回 num1-num2,最好先判断再返回1,-1或者0
if(num1 - num2 > 0 ){
return 1;
}else if(num1 - num2 < 0 ){
return -1;
}
return 0;
}
}
复制代码
作者:
黑马黄武先
时间:
2014-8-15 00:12
很好,赞一个
作者:
孙小亚
时间:
2014-8-15 20:03
学习 了
作者:
laoji741900452
时间:
2014-10-20 18:22
楼主大才,赞!
作者:
cczheng
时间:
2014-11-30 20:57
/*
* 第8题: 把以下IP存入一个txt文件,编写程序把这些IP按数值大小,从小到达排序并打印出来。
61.54.231.245
61.54.231.9
61.54.231.246
61.54.231.48
61.53.231.249
分析:本题涉及IO流读取文本数据,正则表达式,字符串排序的相关知识
1、定义一个字符读取流从指定的txt中读取IP数据
2、将读取到的IP数据转换为字符串,然后进行排序
IP地址分为4段,每一段的最大位数是3,先将最低位补齐(在前面补0),补完后由于有的地址段已经超过3位,
再进行处理,将前面多余的0去掉,保留3位。此时得到的IP每一段都是3位的,将得到的IP地址排序
排序方法可将字符串转换成数组,利用工具类Arrays.sort排序
也可以将IP地址存入到TreeSet中排序
*/
public class Test8 {
public static void main(String[] args) {
//从txt文件中读取IP地址
String str = getIp();
//对ip地址进行排序
Mysort(str);
}
public static void Mysort(String str) {
//第一次替换,给所有的地址段前补两个0,
str = str.replaceAll("(\\d+)", "00$1");
//第二次替换,去除地址段前多余的0,让每一段都是3位
str = str.replaceAll("0*(\\d{3})", "$1");
//读取的IP地址字符串中带有换行符,就以换行符来切割字符串,
//windows中的换行符为\r\n,正则表达式中\都以成对的形式出现,所以切割规则为\\r\\n
String[] arr = str.split("\\r\\n");
//排序方法一
//调用数组工具类的sort方法对数组排序
Arrays.sort(arr);
//遍历数组,打印排序后的IP地址
for (int i = 0; i < arr.length; i++) {
//第三次替换,排序后的IP地址段中有的前面有多余无效的0,将其去掉
System.out.println(arr[i].replaceAll("0+(\\d+)", "$1"));
}
//定义分割付区分两种不同排序方式打印的结果
System.out.println("----------------------------");
//排序方法二
//通过TreeSet集合进行排序
TreeSet<String > set = new TreeSet<String>();
//迭代取出切割后的IP地址字符串将其添加到TreeSet集合中
for (String ip : arr) {
set.add(ip);
}
//遍历set集合,打印排序后的IP地址
for (String s1 : set) {
//第三次替换,排序后的IP地址段中有的前面有多余无效的0,将其去掉
System.out.println(s1.replaceAll("0+(\\d+)", "$1"));
}
}
public static String getIp() {
// 定义一个字符读取流,读取txt中的IP
BufferedReader bfr = null;
//定义一个字符串用来存储读取到IP字符串数据
String line = null;
try {
bfr = new BufferedReader(new FileReader("ip.txt"));
//定义字符缓冲数组
char[] buf = new char[1024];
int len = 0;
while((len = bfr.read(buf))!=-1){
//将读取到的字符数据赋给line
line = new String(buf, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//判断流是否为空,若不为空则关闭字符读取流
if (bfr != null) {
try {
//调用close方法关闭流对象
bfr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//返回IP字符串数据
return line;
}
}
作者:
袁阳1991
时间:
2014-12-5 13:37
学习了,很受用
作者:
别想太多
时间:
2015-6-1 13:00
赞一个!
作者:
RockLee
时间:
2015-6-21 08:02
谢谢,参考下
作者:
j420984
时间:
2015-6-27 21:03
cczheng 发表于 2014-11-30 20:57
/*
* 第8题: 把以下IP存入一个txt文件,编写程序把这些IP按数值大小,从小到达排序并打印出来。
61.54.2 ...
大神,谢谢分享.
作者:
liuch111
时间:
2015-7-16 16:44
好 谢谢
作者:
Ethan丶
时间:
2015-9-28 20:26
谢谢学习了
作者:
弗人
时间:
2015-10-14 12:00
这样子真的好么?
作者:
744919632
时间:
2015-12-18 15:15
天呐,太恐怖了。找了半天才找到这题的答案。
作者:
袁志娜
时间:
2016-9-2 19:39
赞赞赞,谢谢楼主
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2