java - 字符串型IP地址从小到大排序
PHP中文网
PHP中文网 2017-04-18 09:54:59
0
7
916

数据库有IP一列,我想取出时按从小到大排列,但因为是字符串型,排列结果变成了
x.x.x.1
x.x.x.10
x.x.x.11
x.x.x.2.....
有没有办法让字符串像数字一样从小到大排列?或者取出后在java中有什么办法?

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(7)
小葫芦

Postgres本来就有IP类型,设计的时候就应该用上作为字段类型

Anyway,既然你提到了这个问题,那就把它转化为IP类型再排序即可

order by cast(ip as inet)
PHPzhong

转成整数后排序。另外建议对于IP这种字段,直接在数据库里面存整数而不是字符串

给你个转换的例子:

    public long ipToLong(String ipAddress) {
        long result = 0;
        String[] ipAddressInArray = ipAddress.split("\.");

        for (int i = 3; i >= 0; i--) {
            long ip = Long.parseLong(ipAddressInArray[3 - i]);
            result |= ip << (i * 8);
        }

        return result;
    }

    public String longToIp(long ip) {
        StringBuilder sb = new StringBuilder(15);

        for (int i = 0; i < 4; i++) {
            sb.insert(0, Long.toString(ip & 0xff));
            if (i < 3) {
                sb.insert(0, '.');
            }
            ip = ip >> 8;
        }

        return sb.toString();
    }
洪涛

可以先将Ip地址转为int类型,再存入数据库。或者数据库中的字符串取到Java中转成Long再比较。

Ip地址又四个0-255组成,每个部分1Byte,四个部分刚好4Byte,也就是一个Integer。

巴扎黑

shell 就可以排序:

➜  ~ cat 1.txt
1.1.1.5
5.5.5.5
10.1.1.1
2.1.1.1
➜  ~ cat 1.txt|sort -n
1.1.1.5
2.1.1.1
5.5.5.5
10.1.1.1
➜  ~

在vim中排序:

:1,$!sort -n

最后给你个python版的:你用java照着改:

#!/usr/local/bin/python
#-*- coding: UTF-8 -*-
import re
#打开文件
fp=open("ip.txt")
content=fp.readlines()
# print(len(content))
ip_str=''
#p=re.compile("(\d{1,3})\.(\d{1,3}).(\d{1,3})\.(\d{1,3})")
c=list()
for i in range(len(content)):
    c.append(content[i].replace('\n',''))
def ip2int(s):
    l = [int(i) for i in s.split('.')]     
    return (l[0] << 24) | (l[1] << 16) | (l[2] << 8) | l[3]   

c.sort(lambda x, y: cmp(ip2int(x), ip2int(y))) 
print(c)
#重构换行
for j in range(len(c)):
    c[j]=c[j]+'\n'
#写入到本地
succ_fp=open("ip_sort.txt","a+")
succ_fp.writelines(c)
succ_fp.close()
print("排序成功")
PHPzhong

转成int再来排序吧

package org.plyy.utils;

public class IPUtil {
    
    /**
     * @param ip EG:192.168.1.1
     * @return  EG:0xc0a80101
     */
    public static int ipToInteger(String ip) {
        int result = 0;
        String ipArr[] = ip.split("\.");
        for(int i = 0; i < 4; i++) {
            result |= Integer.parseInt(ipArr[i]) << ((3-i) * 8);
        }
        return result;
    }
    
    /**
     * 
     * @param ip EG:0xc0a80101
     * @return EG:192.168.1.1
     */
    public static String intToIp(int ip) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < 4; i++) {
            sb.append(String.valueOf((ip >>> (3-i) * 8) & 0xFF)).append(".");
        }
        sb.deleteCharAt(sb.length() - 1);
        return sb.toString();
    }
    
    public static void main(String[] args) {
        int result = ipToInteger("192.168.1.1");
        System.out.println(Integer.toHexString(result));
        System.out.println("-------------------------");
        String result2 = intToIp(0xc0a80101);
        System.out.println(result2);
    }
    
}
洪涛

思路:order by每个字段

order by to_number(substr(ip, 1, instr(ip,'.',1,1)-1)),
  to_number(substr(ip,instr(ip, '.',1,1)+1,instr(ip, '.',1,2)-instr(ip, '.',1,1)-1)),
  to_number(substr(ip,instr(ip, '.',1,2)+1,instr(ip, '.',1,3)-instr(ip, '.',1,2)-1)),
  to_number(substr(ip,instr(ip, '.',1,3)+1,length(ip)-instr(ip, '.',1,3)));
洪涛

思路是把IP转成整数后排序:

<?php
$ip = array('127.0.0.3','127.0.0.1','127.0.0.2');
foreach($ip as $k => $v) {
    $ip[$k] = ip2long($v);
}
sort($ip);
var_export($ip);
foreach($ip as $k => $v) {
    echo long2ip($v)."\n";
}
//输出
array (
  0 => 2130706433,
  1 => 2130706434,
  2 => 2130706435,
)
127.0.0.1
127.0.0.2
127.0.0.3
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!