黑马程序员技术交流社区

标题: IP地址排序问题 [打印本页]

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

我郁闷了,IP值比较大小 到底该怎么比呢?
作者: 黎志勇    时间: 2014-7-21 17:45

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


作者: 为爱编程    时间: 2014-7-21 20:33
黎志勇 发表于 2014-7-21 17:45
字符‘.’的编码值比数字要小,所以直接用String类中的 compareTo(anotherString) 方法就可以了,根据返回 ...

真的吗?那我试一下
作者: 为爱编程    时间: 2014-7-21 20:42
黎志勇 发表于 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 20:59
本帖最后由 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 21:01
为爱编程 发表于 2014-7-21 20:42
61.53.231.249
61.54.231.245
61.54.231.246

哦,对哦,有点考虑不周全了。我写写看看,不难写的。
作者: 黎志勇    时间: 2014-7-21 21:20
本帖最后由 黎志勇 于 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. }

复制代码




作者: 黎志勇    时间: 2014-7-21 21:45
fantacyleo 发表于 2014-7-21 20:59
按点把IP地址分割了,递归比较嘛,先写个伪代码说一下思路:
int  ipCompare(String s1, String s2)
{

头像空轨好评。
作者: 为爱编程    时间: 2014-7-21 21:55
黎志勇 发表于 2014-7-21 21:20
写了一下。不知道你是不是要写比较器了,我就写了个比较两个IP的。写比较器的可以适当改一下。

都是高手啊
作者: 为爱编程    时间: 2014-7-21 21:58
fantacyleo 发表于 2014-7-21 20:59
按点把IP地址分割了,递归比较嘛,先写个伪代码说一下思路:
int  ipCompare(String s1, String s2)
{

思路挺好,“分割s1,取出第一个点左边的字符串,转成数字n1,剩余字符串为left1”代码怎么实现呢?
作者: 黎志勇    时间: 2014-7-21 22:12
本帖最后由 黎志勇 于 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
复制代码

作者: 为爱编程    时间: 2014-7-21 22:22
黎志勇 发表于 2014-7-21 22:12

其实我也想到这个方法了。哈哈。加个好友吧,哥们
作者: 【灰太狼】    时间: 2014-7-21 22:24
uuuuuuuuuuuuuuuuuuuuuuuuuuu
作者: 黎志勇    时间: 2014-7-21 22:25
为爱编程 发表于 2014-7-21 22:22
其实我也想到这个方法了。哈哈。加个好友吧,哥们

我在考虑正则表达式怎么弄,这玩意完全不会用啊。
作者: 杨冬冬    时间: 2014-7-21 22:52
看到这个题目,我也想到了一个方法用的是BigInteger类,但是行不通,还是看看各位高手的高招吧
作者: fantacyleo    时间: 2014-7-21 23:34
突然想到有一个现成的好东西可以用: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. }
复制代码






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