检查两个数组是否具有相同成员的最佳方法

Ric*_*man 2 arrays go

我有一个字符串数组,我需要将其与另一个字符串数组进行比较,但它们的顺序可能不同。比较两个数组的最佳方法是什么?

这就是我到目前为止所拥有的,只是想知道我是否缺少一种更简单/更有效的方法。

func unorderedEqual(first, second []string) bool {
    if len(first) != len(second) {
        return false
    }
    for _, value := range first {
        if !contains(value, second) {
            return false
        }
    }
    return true
}

func contains(needle string, haystack []string) bool {
    for _, matchValue := range haystack {
        if matchValue == needle {
            return true
        }
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)

Ray*_*ear 7

鉴于您正在进行长度检查,我将采用暗示它们是 1:1 的假设,只是顺序不同。

map[string]bool您可以使用 a检查两者是否存在,在一次(每次)中完成此操作。这利用了以下事实:当键不存在时,map会返回 a 的零值bool,即。false

免责声明:从技术上讲,这是 O(n)*O(map) 的顺序。Go编程语言规范不对映射类型做出任何性能保证。

https://play.golang.org/p/2LUjN5LkXLL

func unorderedEqual(first, second []string) bool {
    if len(first) != len(second) {
        return false
    }
    exists := make(map[string]bool)
    for _, value := range first {
        exists[value] = true
    }
    for _, value := range second {
        if !exists[value] {
            return false
        }
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)

如果你想对内存使用挑剔,你可以bool通过使用 a (空结构)来保存一堆 s (通常可以忽略不计,但对于每个人来说)map[string]struct{},并且你只需稍微不同地检查是否存在,如本例所示。

https://play.golang.org/p/MjwP_wCtYZV

exists[value] = struct{}{}
Run Code Online (Sandbox Code Playgroud)

查看

if _, ok := exists[value]; !ok {
    return false
}
Run Code Online (Sandbox Code Playgroud)

  • 嗨,我并不是要重新发布旧帖子,但我不相信这在**所有**情况下都有效。这是第二个切片包含两个相同元素的示例。https://go.dev/play/p/_9TVw7tcuA4。正如您所看到的,第二个示例应该是错误的。 (2认同)