101 lines
2.5 KiB
Go
101 lines
2.5 KiB
Go
package tools
|
||
|
||
import (
|
||
"fmt"
|
||
"strconv"
|
||
"strings"
|
||
)
|
||
|
||
//字符串切片比较
|
||
func ArrStrCmp(src []string, dest []string) ([]string, []string) {
|
||
msrc := make(map[string]byte) //按源数组建索引
|
||
mall := make(map[string]byte) //源+目所有元素建索引
|
||
var set []string //交集
|
||
//1.源数组建立map
|
||
for _, v := range src {
|
||
msrc[v] = 0
|
||
mall[v] = 0
|
||
}
|
||
//2.目数组中,存不进去,即重复元素,所有存不进去的集合就是并集
|
||
for _, v := range dest {
|
||
l := len(mall)
|
||
mall[v] = 1
|
||
if l != len(mall) {
|
||
continue
|
||
} else {
|
||
set = append(set, v)
|
||
}
|
||
}
|
||
//3.遍历交集,在并集中找,找到就从并集中删,删完后就是补集(即并-交=所有变化的元素)
|
||
for _, v := range set {
|
||
delete(mall, v)
|
||
}
|
||
//4.此时,mall是补集,所有元素去源中找,找到就是删除的,找不到的必定能在目数组中找到,即新加的
|
||
var added, deleted []string
|
||
for v := range mall {
|
||
_, exist := msrc[v]
|
||
if exist {
|
||
deleted = append(deleted, v)
|
||
} else {
|
||
added = append(added, v)
|
||
}
|
||
}
|
||
return added, deleted
|
||
}
|
||
|
||
//uint切片比较
|
||
func ArrUintCmp(src []uint, dest []uint) ([]uint, []uint) {
|
||
msrc := make(map[uint]byte) //按源数组建索引
|
||
mall := make(map[uint]byte) //源+目所有元素建索引
|
||
var set []uint //交集
|
||
//1.源数组建立map
|
||
for _, v := range src {
|
||
msrc[v] = 0
|
||
mall[v] = 0
|
||
}
|
||
//2.目数组中,存不进去,即重复元素,所有存不进去的集合就是并集
|
||
for _, v := range dest {
|
||
l := len(mall)
|
||
mall[v] = 1
|
||
if l != len(mall) {
|
||
continue
|
||
} else {
|
||
set = append(set, v)
|
||
}
|
||
}
|
||
//3.遍历交集,在并集中找,找到就从并集中删,删完后就是补集(即并-交=所有变化的元素)
|
||
for _, v := range set {
|
||
delete(mall, v)
|
||
}
|
||
//4.此时,mall是补集,所有元素去源中找,找到就是删除
|
||
var added, deleted []uint
|
||
for v := range mall {
|
||
_, exist := msrc[v]
|
||
if exist {
|
||
deleted = append(deleted, v)
|
||
} else {
|
||
added = append(added, v)
|
||
}
|
||
}
|
||
return added, deleted
|
||
}
|
||
|
||
//将字符串切片转换为uint切片
|
||
func SliceToString(src []uint, delim string) string {
|
||
return strings.Trim(strings.Replace(fmt.Sprint(src), " ", delim, -1), "[]")
|
||
}
|
||
|
||
//将字符串切片转换为uint切片
|
||
func StringToSlice(src string, delim string) []uint {
|
||
var dest []uint
|
||
if src == "" {
|
||
return dest
|
||
}
|
||
strs := strings.Split(src, delim)
|
||
for _, v := range strs {
|
||
t, _ := strconv.Atoi(v)
|
||
dest = append(dest, uint(t))
|
||
}
|
||
return dest
|
||
}
|