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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 为爱编程 中级黑马   /  2014-7-21 17:07  /  1514 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有道作业题,IP地址排序那个。到底应该用什么方法啊。
我查了下有两个方法
1、256进制那种方法,这个我试了下,不对,ip值转化成的数字太大了,不知道用什么类型来定义了
2、有的人直接把ip的点去掉,转变成数字。这样会排出61.54.231.48<61.53.231.249的结果,很明显也错了

我郁闷了,IP值比较大小 到底该怎么比呢?

15 个回复

倒序浏览

字符‘.’的编码值比数字要小,所以直接用String类中的 compareTo(anotherString) 方法就可以了,根据返回值是正负数还是0,就可以知道哪个ip大点了。

回复 使用道具 举报
黎志勇 发表于 2014-7-21 17:45
字符‘.’的编码值比数字要小,所以直接用String类中的 compareTo(anotherString) 方法就可以了,根据返回 ...

真的吗?那我试一下
回复 使用道具 举报
黎志勇 发表于 2014-7-21 17:45
字符‘.’的编码值比数字要小,所以直接用String类中的 compareTo(anotherString) 方法就可以了,根据返回 ...

61.53.231.249
61.54.231.245
61.54.231.246
61.54.231.48
61.54.231.9

刚测试完,也不对啊。这是按字典顺序排的。。。
回复 使用道具 举报
本帖最后由 fantacyleo 于 2014-7-21 21:00 编辑

按点把IP地址分割了,递归比较嘛,先写个伪代码说一下思路:
int  ipCompare(String s1, String s2)
{
    if (s1.equals(""))
        return 0;
    else {
        分割s1,取出第一个点左边的字符串,转成数字 n1, 剩余字符串为left1
        分割s2,取出第一个点左边的字符串,转成数字 n2, 剩余字符串为left2
        if (s1 < s2)
            return -1;
        if (s1 > s2)
            return 1;
        if (s1 == s2)
            return ipCompare(left1, left2);
    }
     
}


回复 使用道具 举报
为爱编程 发表于 2014-7-21 20:42
61.53.231.249
61.54.231.245
61.54.231.246

哦,对哦,有点考虑不周全了。我写写看看,不难写的。
回复 使用道具 举报
本帖最后由 黎志勇 于 2014-7-21 21:24 编辑

写了一下。不知道你是不是要写比较器了,我就写了个比较两个IP的。写比较器的可以适当改一下。
  1. package test;

  2. public class IpTest {
  3.     public static void main(String[] args) {
  4.         compareIP("61.53.231.249", "61.54.231.245");
  5.         compareIP("61.54.231.246", "61.54.231.48");
  6.         compareIP("61.54.231.48", "61.54.231.9");
  7.         compareIP("192.168.1.1", "192.168.1.1");
  8.     }

  9.     public static void compareIP(String ip1, String ip2) {
  10.         int ip1Bigger = 0;
  11.         String[] ip1Parts = ip1.split("\\.");// 通过"."分隔字符串
  12.         String[] ip2Parts = ip2.split("\\.");
  13.         for (int i = 0; i < ip2Parts.length; i++) {
  14.             ip1Bigger = Integer.parseInt(ip1Parts[i])
  15.                     - Integer.parseInt(ip2Parts[i]);
  16.             if (ip1Bigger != 0) {
  17.                 break;
  18.             }
  19.         }
  20.         char result = ip1Bigger == 0 ? '=' : (ip1Bigger > 0 ? '>' : '<');
  21.         System.out.println(ip1 + result + ip2);
  22.     }
  23. }

复制代码



回复 使用道具 举报
fantacyleo 发表于 2014-7-21 20:59
按点把IP地址分割了,递归比较嘛,先写个伪代码说一下思路:
int  ipCompare(String s1, String s2)
{

头像空轨好评。
回复 使用道具 举报
黎志勇 发表于 2014-7-21 21:20
写了一下。不知道你是不是要写比较器了,我就写了个比较两个IP的。写比较器的可以适当改一下。

都是高手啊
回复 使用道具 举报
fantacyleo 发表于 2014-7-21 20:59
按点把IP地址分割了,递归比较嘛,先写个伪代码说一下思路:
int  ipCompare(String s1, String s2)
{

思路挺好,“分割s1,取出第一个点左边的字符串,转成数字n1,剩余字符串为left1”代码怎么实现呢?
回复 使用道具 举报
本帖最后由 黎志勇 于 2014-7-21 23:57 编辑
为爱编程 发表于 2014-7-21 21:58
思路挺好,“分割s1,取出第一个点左边的字符串,转成数字n1,剩余字符串为left1”代码怎么实现呢? ...
改成使用正则表达式的了
  1.         String ip = "192.168.1.1";
  2.         System.out.println("----分成数组----");
  3.         String[] ipParts = ip.split("\\.", 2);
  4.         System.out.println(Arrays.toString(ipParts));// [192, 168.1.1]
  5.         System.out.println("----分成左右两字符串----");
  6.         String leftPart = ip.replaceAll("\\..+[        DISCUZ_CODE_0        ]quot;, "");
  7.         String rightPart = ip.replaceAll("^.\\d+\\.", "");
  8.         System.out.println("左:" + leftPart + ",右:" + rightPart);// 左:192,右:168.1.1
复制代码
回复 使用道具 举报

其实我也想到这个方法了。哈哈。加个好友吧,哥们
回复 使用道具 举报
uuuuuuuuuuuuuuuuuuuuuuuuuuu
回复 使用道具 举报
为爱编程 发表于 2014-7-21 22:22
其实我也想到这个方法了。哈哈。加个好友吧,哥们

我在考虑正则表达式怎么弄,这玩意完全不会用啊。
回复 使用道具 举报
看到这个题目,我也想到了一个方法用的是BigInteger类,但是行不通,还是看看各位高手的高招吧
回复 使用道具 举报
突然想到有一个现成的好东西可以用:Scanner类
  1. import java.util.*;

  2. public class IPParse {

  3.         public static void main(String[] args) {
  4.                 String ip1 = "192.168.0.102";
  5.                 String ip2 = "192.56.123.103";
  6.                 // 用点作为分隔符扫描IP地址字符串
  7.                 Scanner scanner1 = new Scanner(ip1).useDelimiter("\\.");
  8.                 Scanner scanner2 = new Scanner(ip2).useDelimiter("\\.");
  9.                 while (scanner1.hasNextInt() && scanner2.hasNextInt()) {
  10.                         int n1 = scanner1.nextInt();
  11.                         int n2 = scanner2.nextInt();
  12.                         if (n1 < n2) {
  13.                                 System.out.println("ip1 < ip2");
  14.                                 return;
  15.                         }
  16.                         else if (n1 > n2) {
  17.                                 System.out.println("ip1 > ip2");
  18.                                 return;
  19.                         }
  20.                 }
  21.                 System.out.println("ip1 == ip2");

  22.         }

  23. }
复制代码

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马