黑马程序员技术交流社区

标题: ip的大小比较 [打印本页]

作者: edithe    时间: 2015-6-7 19:14
标题: ip的大小比较
本帖最后由 edithe 于 2015-6-7 19:16 编辑

前几天看到个题,忘了在哪,说是要把几个在txt文件的的ip读取出来并按大小顺序打印出来
我开始是想去点按大小比较,发现不对,然后想按点切割再比较各个段,写了一半代码,就写不下去了,我总感觉有更方便的方法,
后来发现java是有关于操作ip的类的,真是傻了,一试果然是可以的

  1. package test;

  2. import java.io.BufferedReader;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.net.InetAddress;
  6. import java.net.UnknownHostException;
  7. import java.util.Arrays;
  8. import java.util.Collections;
  9. import java.util.Comparator;
  10. import java.util.LinkedList;
  11. /**
  12. *  61.54.231.245
  13.         61.54.231.9
  14.         61.54.231.246
  15.         61.54.231.48
  16.         61.53.231.249
  17. * @author lizewen
  18. *
  19. */
  20. public class IPbijiao {
  21.         public static void main(String[] args) throws IOException {
  22.                 //读取文件,并存入集合,考虑到collections有sort方法
  23.                 BufferedReader br = new BufferedReader(new FileReader("E:\\exam.txt"));
  24.                 LinkedList<String> list = new LinkedList<String>();
  25.                 String data = null;               
  26.                 while ((data = br.readLine()) != null) {
  27.                         list.add(data);
  28.                 }
  29.                 br.close();
  30.                 //根据比较器排序,
  31.                 Collections.sort(list,new ipComparator());
  32.                 System.out.println(list);
  33.         }
  34. }
  35. //写一个IP类型的比较器
  36. class ipComparator implements Comparator<String>{
  37.         @SuppressWarnings("finally")
  38.         @Override
  39.         public int compare(String o1, String o2) {
  40.                 int i = 0;
  41.                 try {
  42.                         i = InetAddress.getByName(o1).hashCode()-InetAddress.getByName(o2).hashCode();
  43.                 } catch (UnknownHostException e) {
  44.                         // TODO Auto-generated catch block
  45.                         e.printStackTrace();
  46.                 }finally{
  47.                         return i;
  48.                 }
  49.         }
  50. }
复制代码
代码很简单,同学应该都是知道的,只是我花了不少时间才想到,拿出来分享下



作者: 郝民杰    时间: 2015-6-7 20:12
还没有学到这一块,提前了解一下,感谢分享。
作者: gainn    时间: 2015-6-7 21:05
hashCode()在我印象中和String类型的数值大小没有什么正相关的联系吧?
用这种哈希值相减的方法也能排序?
作者: 探索者    时间: 2015-6-7 22:58
不错。。
作者: 武汉小菜鸟    时间: 2015-6-13 16:00
你好,你的这个方法,我试了很久好像并不能对IP地址段进行排序!!
作者: edithe    时间: 2015-6-13 16:35
武汉小菜鸟 发表于 2015-6-13 16:00
你好,你的这个方法,我试了很久好像并不能对IP地址段进行排序!!

我没试过怎么敢发上来
作者: YongBao_Summer    时间: 2015-6-13 17:12
没注意过则个方法、
作者: LoveMyself    时间: 2015-6-13 20:23
瞬间发现,我做的好麻烦
作者: a1224577182    时间: 2015-6-13 21:10
不错,学习学习
作者: thoris    时间: 2015-6-13 21:22
翻了下老毕的视频  居然是直接加到TreeSet  再打印就好了。。。
作者: 武汉小菜鸟    时间: 2015-6-13 21:22
edithe 发表于 2015-6-13 16:35
我没试过怎么敢发上来

麻烦你看一下下面的代码
public static void IPSort() {
               
                String ip = "192.168.255.1 10.0.0.1 127.0.8.2 2.2.2.2";
                String[] sp = ip.split(" +");
                TreeSet<java.lang.String> ts = new TreeSet<String>(new Comparator<String>() {
                        public int compare(String o1, String o2) {
                                int num = 0;
                                try {
                                        num = InetAddress.getByName(o1).hashCode()-InetAddress.getByName(o2).hashCode();
                                } catch (UnknownHostException e) {
                                        e.printStackTrace();
                                } finally {
                                        return num;
                                }
                               
                        }
                });
                for(String s:sp)
                        ts.add(s);
               
                for(String s:ts)
                        System.out.println(s);
        }
作者: 武汉小菜鸟    时间: 2015-6-13 21:45
武汉小菜鸟 发表于 2015-6-13 21:22
麻烦你看一下下面的代码
public static void IPSort() {
               

好想并不能排序!!!
作者: edithe    时间: 2015-6-15 10:52
本帖最后由 edithe 于 2015-6-15 11:04 编辑
武汉小菜鸟 发表于 2015-6-13 21:45
好想并不能排序!!!

我试了下你的代码,好像也是,但是,他们的排序还是有规律的,我觉得这样排序没有问题,如果从数字或者字符串的角度看,这样的排序的不对的,但是这是ip,ip是分了段的,你应该知道ip分了5个段吧(好像是五个),应该有A段大于B段这样的规律吧
作者: edithe    时间: 2015-6-15 11:07
thoris 发表于 2015-6-13 21:22
翻了下老毕的视频  居然是直接加到TreeSet  再打印就好了。。。

我没看过老毕的视频,没想到这么简答的事,还是我搞复杂了,汗颜……
作者: 十字天堂    时间: 2015-6-15 14:26
虽然不懂,不过感觉好流逼....
作者: world.net    时间: 2015-6-15 14:59
学习学习
作者: 武汉小菜鸟    时间: 2015-6-15 17:26
edithe 发表于 2015-6-15 10:52
我试了下你的代码,好像也是,但是,他们的排序还是有规律的,我觉得这样排序没有问题,如果从数字或者字 ...

IP地址分四段,我觉得应该有专门判断ip大小的类或者方法,只是我们不知道!
作者: edithe    时间: 2015-6-18 11:37
武汉小菜鸟 发表于 2015-6-15 17:26
IP地址分四段,我觉得应该有专门判断ip大小的类或者方法,只是我们不知道! ...

我觉得我写的这个比较器应该能比较ip大小,你可以多写几个段位的ip,比较试下嘛
作者: meng12    时间: 2015-6-18 12:26
过来学习一下
作者: 武汉小菜鸟    时间: 2015-6-18 15:55
edithe 发表于 2015-6-18 11:37
我觉得我写的这个比较器应该能比较ip大小,你可以多写几个段位的ip,比较试下嘛 ...

试了不行啊
作者: lucien_he    时间: 2015-6-18 16:10
方法 不错
作者: 小龙编程世界    时间: 2015-6-18 17:59
不错,谢谢楼主分享
作者: 我的最优解    时间: 2015-6-18 20:03
以前真没见过这种
作者: edithe    时间: 2015-6-18 21:03
武汉小菜鸟 发表于 2015-6-18 15:55
试了不行啊

那应该是是写的有问题吧,我也是临时想到的,可能不对吧,误导大家,深表歉意
作者: pizhihui    时间: 2015-6-18 22:36
很好,迷雾中走出来了
作者: 武汉小菜鸟    时间: 2015-6-18 22:58
edithe 发表于 2015-6-18 21:03
那应该是是写的有问题吧,我也是临时想到的,可能不对吧,误导大家,深表歉意 ...

没有啊,能想到这个,你很棒啊,大家要多多探讨,才能共同进步!加油!
作者: java8023    时间: 2015-6-19 11:24
想法挺好的啊,就是不知道,比较对象的哈希值,可以比较出来大小吗
作者: edithe    时间: 2015-6-20 12:42
java8023 发表于 2015-6-19 11:24
想法挺好的啊,就是不知道,比较对象的哈希值,可以比较出来大小吗

我试的可以
作者: 一口老郭    时间: 2015-6-20 21:32
谢谢楼主,学习了




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