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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Joney__ 中级黑马   /  2013-11-14 21:17  /  3465 人查看  /  24 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

编写程序把这些IP按数值大小,从小到大排序出来。
61.54.231.245
61.54.231.9
61.54.231.246
61.54.231.48
61.53.231.249

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
To + 1 + 2 很给力!

查看全部评分

24 个回复

倒序浏览
  1. /***
  2. @author Joney
  3. *         思路: 1上面Ip按数值大小,排序,有序,用TreeSet存储
  4. *         2遍历数据,按自定义要求排序 3
  5. *         用输出流输出到txt中
  6. */
  7. public class Test8 {

  8.         public static void main(String[] args) {
  9.                 // 定义一个TreeSet数组存入上面ip
  10.                 // 创建集合对象
  11.                 TreeSet<String> tm = new TreeSet<String>(new Comparator<String>() {

  12.                         @Override
  13.                         public int compare(String s1, String s2) {
  14.                                 int num=s1.length()-s2.length();
  15.                                 int num2=(num==0)?s1.compareTo(s2):num;
  16.                                 return num2;
  17.                         }
  18.                 });
  19.                
  20.                 // 添加元素
  21.                 tm.add("61.54.231.245");
  22.                 tm.add("61.54.231.9");
  23.                 tm.add("61.54.231.246");
  24.                 tm.add("61.54.231.48");
  25.                 tm.add("61.53.231.249");
  26.                 for(String st:tm){
  27.                         System.out.println(st);
  28.                 }
  29.                 System.out.println("***********************************");
  30.                 String []select ={"61.54.231.245","61.54.231.9","61.54.231.246","61.54.231.48","61.53.231.249"};
  31.                 Arrays.sort(select);
  32.                 for(String e:select){
  33.                         System.out.println(e);
  34.                 }

  35.         }

  36. }
复制代码
回复 使用道具 举报
上面是我想的两个思路,明显不对,想按IP分开比较,截取字符串,分别比,单觉得用TreeMap比较方便点,在比较的时候想的是先判断长度是否相等,在判断数据字母大小进行比较,完了输出。以上的输出是
61.54.231.9
61.54.231.48
61.53.231.249
61.54.231.245
61.54.231.246
***********************************
61.53.231.249
61.54.231.245
61.54.231.246
61.54.231.48
61.54.231.9
回复 使用道具 举报
61.53.231.249
61.54.231.9
61.54.231.48
61.54.231.245
61.54.231.246
我感觉正确输出应该是这样的,请问该怎么做
回复 使用道具 举报
用String类的split分割出数组,然后进行比较,比用treemap简单吧?

评分

参与人数 1黑马币 +20 收起 理由
Joney__ + 20 赞一个!

查看全部评分

回复 使用道具 举报
compare方法里面还是要把字符串分割开来比较的
回复 使用道具 举报
rebirth 中级黑马 2013-11-14 22:05:33
7#
写一个IP类,实现comparable接口,至于排序,数量少的话用不着TreeMap吧,毕竟TreeMap是红黑树,用这个排序,代码是少了,但是运行时间长了。ip不多的话就自己写冒泡,多的话就自己写快排,当然你用Arrays.sort()也成,没记错的话这个方法对于个数少的用冒泡,个数多的用归并

评分

参与人数 1黑马币 +20 收起 理由
Joney__ + 20 赞一个!

查看全部评分

回复 使用道具 举报
这是自动排序,可是用TreeSet,你也可以分割字符串,但是这有现成的类,那么就方便了。
  1. public class Demo {
  2.         public static void main(String[] agrs) {
  3.           TreeSet<String> set=new TreeSet<String>();
  4.           set.add("61.54.231.245");
  5.           set.add("61.54.231.9");
  6.           set.add("61.54.231.246");
  7.           set.add("61.54.231.48");
  8.           set.add("61.53.231.249");
  9.          
  10.           System.out.println(set);
  11.         }

  12.        
  13. }
复制代码

评分

参与人数 1黑马币 +20 收起 理由
Joney__ + 20 赞一个!

查看全部评分

回复 使用道具 举报
Joney__ 中级黑马 2013-11-15 08:30:41
9#
赵晓海 发表于 2013-11-14 21:42
用String类的split分割出数组,然后进行比较,比用treemap简单吧?

刚开始我是想TreeMap不是自带排序功能嘛,如果按类来比较,判断类的属性什么的,这样好写判断,谁知道写判断的时候不好写了,你的意思是写五个数组分别按  .  来截取?然后分别比较每个元素?最后在输出?你能写代码出来吗?我看下,谢谢了。真心不知道该怎么比较
回复 使用道具 举报
rebirth 发表于 2013-11-14 22:05
写一个IP类,实现comparable接口,至于排序,数量少的话用不着TreeMap吧,毕竟TreeMap是红黑树,用这个排序 ...

实现comparable接口后应该怎么判断?能具体写代码看下码?谢谢。
回复 使用道具 举报
杨增坤 发表于 2013-11-15 00:00
这是自动排序,可是用TreeSet,你也可以分割字符串,但是这有现成的类,那么就方便了。 ...

这样写排序不了的,没有我想要的排序效果,我上面用的就是这种方法,呵呵,还是不行。不过非常谢谢你
回复 使用道具 举报

把以下IP存入一个txt文件,编写程序把这些IP按数值大小, 从小到达排序并打印出来。
61.54.231.245
61.54.231.9
61.54.231.246
61.54.231.48
61.53.231.249
这是完整的题目,我参考上面截取方法,写了下面的代码,怎么截取出来的数组是空的?那里错了?
回复 使用道具 举报
本帖最后由 Joney__ 于 2013-11-15 09:35 编辑
  1. <p>import java.io.BufferedReader;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileReader;
  4. import java.io.IOException;


  5. /**
  6. * 把以下IP存入一个txt文件,编写程序把这些IP按数值大小,
  7. * 从小到达排序并打印出来。
  8. * 61.54.231.245
  9. * 61.54.231.9
  10. * 61.54.231.246
  11. * 61.54.231.48
  12. * 61.53.231.249
  13. *  1:创建ip.txt文件,在里面写入上面Ip
  14. *  2:用BuffReader读取IP.txt中的数据
  15. *  3:把获取的单个字符转换成字符串数组
  16. *  4:在用“.”进行拆分
  17. *  5:拆分后进行比较并输出
  18. *
  19. */
  20. public class Test8 {

  21.         public static void main(String[] args) {
  22.         
  23.                 BufferedReader br=null;
  24.                 try {
  25.                         br=new BufferedReader(new FileReader("Ip.txt"));
  26.                         char[] chs = new char[1024];
  27.                         int len = 0;
  28.                         while((len = br.read(chs)) != -1){
  29.                                 //将字符数组转换成字符串数组
  30.                                 String s3 = String.valueOf(chs);
  31.                                 //System.out.println(s3);
  32.                                 String[] strArray = s3.split(".");
  33.                                 
  34.                                 for (int x = 0; x < strArray.length; x++) {
  35.                                         System.out.println(strArray[x]);
  36.                                 }
  37.                                 //System.out.print(String.copyValueOf(chs, 0, len));
  38.                         }
  39.                 } catch (FileNotFoundException e) {
  40.                         // TODO Auto-generated catch block
  41.                         e.printStackTrace();
  42.                 } catch (IOException e) {
  43.                         // TODO Auto-generated catch block
  44.                         e.printStackTrace();
  45.                 }finally{
  46.                         try {
  47.                                 br.close();
  48.                         } catch (IOException e) {
  49.                                 // TODO Auto-generated catch block
  50.                                 e.printStackTrace();
  51.                         }
  52.                 }
  53.         }

  54. }
  55. </p>
复制代码
回复 使用道具 举报
给你一个最简单,代码最少的。
  1. import java.util.*;
  2. class  IpText
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 text();
  7.         }

  8.         public static void text()
  9.         {
  10.                 String ip = "61.54.231.245  61.54.231.9  61.54.231.246  61.54.231.48  61.53.231.249";
  11.                                
  12.                 ip = ip.replaceAll("([0-9]+)","00$1");//字符串替换,都补上两个00 ,用正则表达式完成。
  13.        
  14.                 ip = ip.replaceAll("0*([0-9]{3})","$1"); //把补多的0去掉,每一个地址段只保留3位数字,如第一个变成 061.054.231.245
  15.                
  16.                 String[] arr = ip.split(" +");//切割后存入到数组中
  17.                
  18.                 Arrays.sort(arr);//数组快速排序方法,这个方法最简单

  19.                 //输出数组内容
  20.                 for(String s : arr)
  21.                 {
  22.                         System.out.println(s.replaceAll("0*([0-9]+)","$1"));  //在输出时,顺便把补上的再0去掉
  23.                 }
  24.         }
  25. }
复制代码
回复 使用道具 举报
枫儿 金牌黑马 2013-11-15 09:34:38
15#
杨增坤 发表于 2013-11-15 00:00
这是自动排序,可是用TreeSet,你也可以分割字符串,但是这有现成的类,那么就方便了。 ...

这个最简洁~~~
回复 使用道具 举报
向阳泪无痕 发表于 2013-11-15 09:33
给你一个最简单,代码最少的。

代码不错。。。就是看不懂
回复 使用道具 举报
Joney__ 发表于 2013-11-15 08:35
实现comparable接口后应该怎么判断?能具体写代码看下码?谢谢。

这个要把ip写成ip类,这是面向对象的万事万物皆对象。你可以用TreeSet写,但是TreeSet用的是红黑树,这个你代码量少了些,但是犯不着用红黑树做。排序算法是基础嘛,少的话自己写一个冒泡,多的时候自己写一个快排。当然你如果不爱写,就和我的代码一样用Arrays.sort()方法,因为你数组不是整型数组所以少的话会调用冒泡,多的话调用归并。我记得没错的话是以7个元素为界限

  1. import java.util.*;
  2. //61.54.231.9
  3. //61.54.231.48
  4. //61.54.231.48
  5. //61.53.231.249
  6. //61.54.231.245
  7. //61.54.231.246
  8. public class Main {
  9.     public static void main(String[] args){
  10.         IP[] ips = new IP[6];
  11.         ips[0] = new IP("61.54.231.9");
  12.         ips[1] = new IP("61.54.231.48");
  13.         ips[2] = new IP("61.54.231.48");
  14.         ips[3] = new IP("61.53.231.249");
  15.         ips[4] = new IP("61.54.231.245");
  16.         ips[5] = new IP("61.54.231.246");
  17.         
  18. //        Arrays.sort(ips);
  19. //        for(int i=0; i<ips.length; i++){
  20. //            System.out.println(ips[i]);
  21. //        }

  22.         Set<IP> tm = new TreeSet<IP>();
  23.         tm.add(ips[0]);
  24.         tm.add(ips[1]);
  25.         tm.add(ips[2]);
  26.         tm.add(ips[3]);
  27.         tm.add(ips[4]);
  28.         tm.add(ips[5]);
  29.         for(IP ip : tm){
  30.             System.out.println(ip);
  31.         }
  32.     }
  33. }
  34. class IP implements Comparable<IP>{
  35.     private String ip;
  36.    
  37.     public IP(){}
  38.     public IP(String str){
  39.         ip = str;
  40.     }
  41.     public int returnValue(){
  42.         String[] arr = ip.split("\\.");
  43.         return Integer.parseInt(arr[0])*256*256*256 + Integer.parseInt(arr[1])*256*256 + Integer.parseInt(arr[2])*256 + Integer.parseInt(arr[3]);
  44.     }
  45.     public int compareTo(IP ip) {
  46.         if(this.returnValue() > ip.returnValue() ){
  47.             return 1;
  48.         }else{
  49.             return -1;
  50.         }
  51.     }
  52.     public String toString() {
  53.         return ip;
  54.     }
  55.    
  56. }
复制代码

评分

参与人数 1黑马币 +30 收起 理由
Joney__ + 30 赞一个!

查看全部评分

回复 使用道具 举报
rebirth 发表于 2013-11-15 10:05
这个要把ip写成ip类,这是面向对象的万事万物皆对象。你可以用TreeSet写,但是TreeSet用的是红黑树,这个 ...

测试了,输出没有问题,我好好学习下,请问如果按我上面写得那种,这些IP是读取txt的,该怎么改?我转换数组没有数据怎么回事?不能按“.”拆分吗?
回复 使用道具 举报
狼王 高级黑马 2013-11-15 11:33:12
19#
这是一个入学测试题,尽量自己解决
回复 使用道具 举报
狼王 发表于 2013-11-15 11:33
这是一个入学测试题,尽量自己解决

我哪里有点问题卡住了,来这问问,想弄明白该怎么做,要的是方法,不是代码
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马