我有一个字符串数组,我需要将其与另一个字符串数组进行比较,但它们的顺序可能不同。比较两个数组的最佳方法是什么?
这就是我到目前为止所拥有的,只是想知道我是否缺少一种更简单/更有效的方法。
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)
鉴于您正在进行长度检查,我将采用暗示它们是 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)
| 归档时间: |
|
| 查看次数: |
10479 次 |
| 最近记录: |