为了账号安全,请及时绑定邮箱和手机立即绑定

比较两个切片是否缺少元素

比较两个切片是否缺少元素

Go
jeck猫 2023-07-10 16:48:13
我有两片:a []string, b []string. b包含所有相同的元素加上a一个额外的元素。索引:值彼此不匹配,但值匹配,否则我可以执行类似 和strings.Join()的操作strings.Replace()。这就是我正在尝试的。package mainimport (    "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,而不是针对唯一值1sdsdfsdfsdsdfaa :::: aca :::: cd :::: cf :::: cb :::: cNot present:  cea :::: ed :::: ef :::: eb :::: eNot present:  ega :::: gd :::: gf :::: gb :::: g
查看完整描述

2 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

比较两个切片是否缺少元素


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


查看完整回答
反对 回复 2023-07-10
?
浮云间

TA贡献1829条经验 获得超4个赞

/*

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]


查看完整回答
反对 回复 2023-07-10
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信