gpt4 book ai didi

sorting - golang 将 IP 地址片排序为字符串

转载 作者:IT王子 更新时间:2023-10-29 01:24:23 26 4
gpt4 key购买 nike

我想在 Golang 中对 IP 地址片段(仅 IPV4)进行排序。

使用 sort.Strings() 的原生 sort 包由于明显的原因不起作用,因为 192.168.4.41 自然会被排序在 192.168.4.5

前面

通过在 map 中将 IP 的数值与 IP 字符串一起排序,我想出了一种方法来实现它,但感觉太手动了。这是分解 IP 字符串并对地址进行排序的最有效方法吗?

https://play.golang.org/p/FUYQKuhgUq8

package main

import (
"fmt"
"strconv"
"strings"
"sort"
)

func main() {
ips := []string{
"192.168.1.5",
"69.52.220.44",
"10.152.16.23",
"192.168.3.10",
"192.168.1.4",
"192.168.1.41",
}

ipsWithInt := make(map[string]int64)

for _, ip := range ips {
ipStr := strings.Split(ip, ".")

oct0, _ := strconv.ParseInt(ipStr[0], 10, 64)
ipInt0 := oct0 * 255 * 255 * 255

oct1, _ := strconv.ParseInt(ipStr[1], 10, 64)
ipInt1 := oct1 * 255 * 255

oct2, _ := strconv.ParseInt(ipStr[2], 10, 64)
ipInt2 := oct2 * 255

oct3, _ := strconv.ParseInt(ipStr[3], 10, 64)
ipInt3 := oct3

ipInt := ipInt0 + ipInt1 + ipInt2 + ipInt3

ipsWithInt[ip] = ipInt
}


type kv struct {
Key string
Value int64
}

var ss []kv
for k, v := range ipsWithInt {
ss = append(ss, kv{k, v})
}

sort.Slice(ss, func(i, j int) bool {
return ss[i].Value < ss[j].Value
})


for _, kv := range ss {
fmt.Printf("%s\n", kv.Key)
}
}

结果:

10.152.16.23
69.52.220.44
192.168.1.4
192.168.1.5
192.168.1.41
192.168.3.10

最佳答案

有很多可能的方法,但很快想到的最简单的方法是将它们解析为 net.IP(它们只是 byte slice ,更准确地表示IP),然后对它们进行排序:

realIPs := make([]net.IP, 0, len(ips))

for _, ip := range ips {
realIPs = append(realIPs, net.ParseIP(ip))
}

sort.Slice(realIPs, func(i, j int) bool {
return bytes.Compare(realIPs[i], realIPs[j]) < 0
})

这里的工作示例:https://play.golang.org/p/UtuvVz44_c8

这具有额外的优势,即无需修改即可与 IPv6 地址同样良好地工作。

关于sorting - golang 将 IP 地址片排序为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48389585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com