比较两个切片中缺失的元素

5

我有两个列表: a []string, b []stringb 列表包含了与a 列表中所有元素相同的元素,以及一个额外的元素。 在两个列表中,索引: 值不匹配,但值相同,否则我可以使用 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则不返回true。

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
2个回答

5

比较两个切片是否有缺失元素

我有两个切片:a []stringb []stringb 包含与 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

我添加了一些输出以可视化正在发生的事情,现在更有意义了。感谢您提供的解决方案。 - RK844

1
/*
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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接