Rumah > Soal Jawab > teks badan
数据库有IP一列,我想取出时按从小到大排列,但因为是字符串型,排列结果变成了
x.x.x.1
x.x.x.10
x.x.x.11
x.x.x.2.....
有没有办法让字符串像数字一样从小到大排列?或者取出后在java中有什么办法?
高洛峰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)
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();
}
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.
巴扎黑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("排序成功")
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);
}
}
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)));
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