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

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

PHP中文网
PHP中文网

认证高级PHP讲师

répondre à tous(7)
小葫芦

Postgres a déjà un type IP, qui doit être utilisé comme type de champ lors de la conception

Quoi qu'il en soit, puisque vous avez mentionné ce problème, convertissez-le simplement en type IP et triez-le

order by cast(ip as inet)
PHPzhong

Convertissez en entier puis triez. Il est également recommandé que pour les champs tels que IP, stockez les entiers directement dans la base de données au lieu des chaînes

Donnez-vous un exemple de conversion :

    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();
    }
洪涛

Vous pouvez d'abord convertir l'adresse IP en type int, puis la stocker dans la base de données. Ou prenez la chaîne dans la base de données et convertissez-la en Long en Java, puis comparez.

L'adresse IP se compose de quatre parties 0-255, chaque partie fait 1 octet et les quatre parties font exactement 4 octets, ce qui est un nombre entier.

巴扎黑

shell peut trier :

➜  ~ 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
➜  ~

Trier dans vim :

:1,$!sort -n

Enfin, je vais vous donner une version python : vous pouvez la modifier en 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

Convertissez-le en int puis triez-le

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);
    }
    
}
洪涛

Idée : trier par chaque champ

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)));
洪涛

L'idée est de convertir l'IP en un entier puis de trier :

<?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
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!