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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© edithe 中级黑马   /  2015-6-7 19:14  /  6262 人查看  /  28 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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. }
复制代码
代码很简单,同学应该都是知道的,只是我花了不少时间才想到,拿出来分享下


评分

参与人数 2技术分 +1 黑马币 +18 收起 理由
王艺霖 + 18
lwj123 + 1

查看全部评分

28 个回复

倒序浏览
还没有学到这一块,提前了解一下,感谢分享。
回复 使用道具 举报
hashCode()在我印象中和String类型的数值大小没有什么正相关的联系吧?
用这种哈希值相减的方法也能排序?
回复 使用道具 举报
不错。。
回复 使用道具 举报
你好,你的这个方法,我试了很久好像并不能对IP地址段进行排序!!
回复 使用道具 举报
武汉小菜鸟 发表于 2015-6-13 16:00
你好,你的这个方法,我试了很久好像并不能对IP地址段进行排序!!

我没试过怎么敢发上来
回复 使用道具 举报
没注意过则个方法、
回复 使用道具 举报
瞬间发现,我做的好麻烦
回复 使用道具 举报
不错,学习学习
回复 使用道具 举报
翻了下老毕的视频  居然是直接加到TreeSet  再打印就好了。。。
回复 使用道具 举报
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:22
麻烦你看一下下面的代码
public static void IPSort() {
               

好想并不能排序!!!
回复 使用道具 举报
本帖最后由 edithe 于 2015-6-15 11:04 编辑
武汉小菜鸟 发表于 2015-6-13 21:45
好想并不能排序!!!

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

我没看过老毕的视频,没想到这么简答的事,还是我搞复杂了,汗颜……
回复 使用道具 举报
虽然不懂,不过感觉好流逼....
回复 使用道具 举报
学习学习
回复 使用道具 举报
edithe 发表于 2015-6-15 10:52
我试了下你的代码,好像也是,但是,他们的排序还是有规律的,我觉得这样排序没有问题,如果从数字或者字 ...

IP地址分四段,我觉得应该有专门判断ip大小的类或者方法,只是我们不知道!
回复 使用道具 举报
武汉小菜鸟 发表于 2015-6-15 17:26
IP地址分四段,我觉得应该有专门判断ip大小的类或者方法,只是我们不知道! ...

我觉得我写的这个比较器应该能比较ip大小,你可以多写几个段位的ip,比较试下嘛
回复 使用道具 举报
过来学习一下
回复 使用道具 举报
edithe 发表于 2015-6-18 11:37
我觉得我写的这个比较器应该能比较ip大小,你可以多写几个段位的ip,比较试下嘛 ...

试了不行啊
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马