go - 合并带连字符的字符串范围之外的区间
问题描述
我有一个这样的字符串:
ports := []string{"1", "2-7", "12-1200", "10-500"}
我想用这个做一个整数集,输出应该是:
[]intSet{ 1, 2-7, 10-1200 }
哪里intSet
是某种整数集,我可以轻松地从中删除和添加元素。
更新 1
intSet
是一个列表sets
。所以,2-7
也是一个集合。
更新 2
这里最大的集合被合并。
例如
- “1”-> 1
- “2-7”-> 2-7
- "12-1200" & "10-500" => "10..12.....500....1200" -> 10-1200
因为它是一个set
所以它包含一个独特的范围,一个覆盖整个集合的范围。
解决方案
package main
import (
"fmt"
"log"
"strconv"
"strings"
)
type intSet struct {
start int
end int
}
func (s intSet) String() string {
if s.start == s.end {
return fmt.Sprintf("%d", s.start)
}
return fmt.Sprintf("%d-%d", s.start, s.end)
}
func (s intSet) in(i int) bool {
return s.start <= i && i <= s.end
}
func (s *intSet) union(set intSet) {
if set.start < s.start {
s.start = set.start
}
if set.end > s.end {
s.end = set.end
}
}
func insert(set intSet, is []intSet) bool {
for i, s := range is {
if s.in(set.start) || s.in(set.end) {
is[i].union(set)
return true
}
//updated here with thankful to @mh-cbon
if set.in(s.start) || set.in(s.end) {
is[i].union(set)
return true
}
}
return false
}
func main() {
var set []intSet
ports := []string{"1", "2-7", "12-1200", "10-500", "9-5500"}
for _, port := range ports {
s := strings.Split(port, `-`)
if len(s) < 1 || len(s) > 2 {
log.Fatalln(`set cannot have multiple values or no value`)
}
start, err := strconv.Atoi(s[0])
if err != nil {
log.Fatalln(err)
}
end := start
if len(s) == 2 {
end, err = strconv.Atoi(s[1])
if err != nil {
log.Fatalln(err)
}
}
temSet := intSet{
start: start,
end: end,
}
if !insert(temSet, set) {
set = append(set, temSet)
}
}
fmt.Println(set) //[1 2-7 9-5500]
}
跑到这里
推荐阅读
- java - 在java中加载的图像上绘制对象
- postgresql - 如何在 REASSIGN OWNED 等 SQL 语句中引用 PostgreSQL 过程的参数值?
- reflection - D有反射吗?
- android - 颤动 - 未检测到添加 AVM
- r - 对长数据框进行排序,就好像它很宽一样
- java - 尝试在 Spring 上设置数据源以通过 MySQL 进行授权 - 安全 bean 未加载/自动装配问题
- javascript - 从 .then 函数返回变量
- python - 使用 `less +F` 看不到 Python 正在写入的文件的更新
- python - Pip3 不会更新 TensorFlow
- python - ast 将字符串列表转换为列表的替代方法