比较两个缺少元素的切片

时间:2019-08-11 02:34:42

标签: arrays go

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

2 个答案:

答案 0 :(得分:1)

  

比较两个缺少元素的切片

     

我有两个切片: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

答案 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]