我有两个切片:a[]string
,b[]string
。 b
包含与a
相同的所有元素,外加一个额外元素。 index:值彼此不匹配,但值匹配,否则我可以做类似strings.Join()
和strings.Replace()
的事情。这就是我正在尝试的。
package main
import (
"fmt"
"github.com/google/go-cmp/cmp"
)
func compare(start_keys []string, end_keys []string) string {
match := make([]string, len(start_keys))
q := 0
for i := 0; i < len(end_keys); i++ {
for z := 0; z < len(start_keys); z++ {
if end_keys[i] == start_keys[z] {
match[q] = start_keys[z]
q++
}
}
} // now matches known
for i := 0; i < len(end_keys); i++ {
n := end_keys[i] // current element to compare to
s := nip(match, n) // compare result
if s == true { // if no matches, print
a := end_keys[i]
fmt.Println("Not present: ", a)
}
i++
}
fmt.Println("List=", match)
return "error"
}
func nip(matches []string, element string) bool {
zyx := 0
for n := 0; n < len(matches); n++ {
if matches[n] == element {
n++
zyx++
} else if matches[n] != element {
n++
}
}
if zyx == 0 {
return true
}
return false
}
func main() {
start_keys := []string{"a", "b", "c", "d", "e", "f", "g"}
end_keys := []string{"a", "1sdsdfsdfsdsdf", "c", "d", "e", "f", "g", "b"}
x := compare(start_keys, end_keys)
x = x
foo := cmp.Diff(start_keys, end_keys)
fmt.Println(foo)
}
matches[]
保持了我的期望,但是nip()
在某些匹配项上返回true,而不是唯一值1sdsdfsdfsdsdf
a
a :::: a
c
a :::: c
d :::: c
f :::: c
b :::: c
Not present: c
e
a :::: e
d :::: e
f :::: e
b :::: e
Not present: e
g
a :::: g
d :::: g
f :::: g
b :::: g
答案 0 :(得分:1)
比较两个缺少元素的切片
我有两个切片:
a[]string
,b[]string
。b
包含相同的内容 元素为a
加上一个额外字符。
例如,
package main
import (
"fmt"
)
func missing(a, b []string) string {
ma := make(map[string]bool, len(a))
for _, ka := range a {
ma[ka] = true
}
for _, kb := range b {
if !ma[kb] {
return kb
}
}
return ""
}
func main() {
a := []string{"a", "b", "c", "d", "e", "f", "g"}
b := []string{"a", "1sdsdfsdfsdsdf", "c", "d", "e", "f", "g", "b"}
fmt.Println(missing(a, b))
}
输出:
1sdsdfsdfsdsdf
答案 1 :(得分:0)
/*
An example of how to find the difference between two slices.
This example uses empty struct (0 bytes) for map values.
*/
package main
import (
"fmt"
)
// empty struct (0 bytes)
type void struct{}
// missing compares two slices and returns slice of differences
func missing(a, b []string) []string {
// create map with length of the 'a' slice
ma := make(map[string]void, len(a))
diffs := []string{}
// Convert first slice to map with empty struct (0 bytes)
for _, ka := range a {
ma[ka] = void{}
}
// find missing values in a
for _, kb := range b {
if _, ok := ma[kb]; !ok {
diffs = append(diffs, kb)
}
}
return diffs
}
func main() {
a := []string{"a", "b", "c", "d", "e", "f", "g"}
b := []string{"a", "c", "d", "e", "f", "g", "b"}
c := []string{"a", "b", "x", "y", "z"}
fmt.Println("a and b diffs", missing(a, b))
fmt.Println("a and c diffs", missing(a, c))
}
输出
a and b diffs []
a and c diffs [x y z]