Rumah  >  Soal Jawab  >  teks badan

java - 字符串型IP地址从小到大排序

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

PHP中文网PHP中文网2741 hari yang lalu920

membalas semua(7)saya akan balas

  • 高洛峰

    高洛峰2017-04-18 09:56:59

    Postgres sudah mempunyai jenis IP, yang harus digunakan sebagai jenis medan semasa reka bentuk

    Apa pun, memandangkan anda menyebut masalah ini, cuma tukarkannya kepada jenis IP dan susunkannya

    order by cast(ip as inet)

    balas
    0
  • PHPz

    PHPz2017-04-18 09:56:59

    Tukar kepada integer dan kemudian isi. Ia juga disyorkan bahawa untuk medan seperti IP, simpan integer terus dalam pangkalan data dan bukannya rentetan

    Beri anda contoh penukaran:

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

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 09:56:59

    Anda boleh menukar alamat IP kepada jenis int dahulu dan kemudian menyimpannya dalam pangkalan data. Atau ambil rentetan dalam pangkalan data dan tukarkannya menjadi Long di Java dan kemudian bandingkan.

    Alamat IP terdiri daripada empat bahagian 0-255, setiap bahagian ialah 1Byte dan empat bahagian itu betul-betul 4Byte, iaitu Integer.

    balas
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:56:59

    cangkang boleh mengisih:

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

    Isih dalam vim:

    :1,$!sort -n
    

    Akhir sekali, saya akan memberi anda versi python: anda boleh mengubah suainya dalam 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("排序成功")
    

    balas
    0
  • PHPz

    PHPz2017-04-18 09:56:59

    Tukarkannya kepada int dan kemudian susunkannya

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

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 09:56:59

    Idea: pesanan mengikut setiap medan

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

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 09:56:59

    Ideanya adalah untuk menukar IP kepada integer dan kemudian mengisih:

    <?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

    balas
    0
  • Batalbalas