3 回答
TA贡献1827条经验 获得超7个赞
检查在每个数组中找到的所有过滤器字符串,然后决定追加到切片中。我还添加了一些评论。
hold := make([][]string, 0)
for _, arr := range arrays {
isValid := true // Initialy set true
for _, f := range filterBy {
if ok := inArray(f, arr); !ok {
isValid = false // if any filter string does match then make false and break
break
}
}
// If all filter string found the isValid is true, then append in slice
if(isValid){
hold = append(hold, arr)
}
}
去游乐场的完整代码在这里
但有效的解决方案是
filterByMap := make(map[string]bool)
// Create a map for filter slice
for _, a := range filterBy {
filterByMap[a] = true
}
for _, arr := range arrays {
cnt := 0 // Initial the counter
for _, a := range arr {
if filterByMap[a] {
cnt++ // Increment the counter if filter string found
}
}
// Check if all filter string found ? Append if yes
if(cnt >= len(filterBy)){
hold = append(hold, arr)
}
}
TA贡献1898条经验 获得超8个赞
函数中的逻辑inArray对于检查单针s string是否在大海捞针中是正确的arr []string。如果您想扩展它以检查所有针ss []string是否都存在于大海捞针arr []string中,那么您至少还需要在针上循环。这是一个例子:
func allInArray(ss []string, arr []string) bool {
for _, s := range ss {
if !inArray(s, arr) {
return false
}
}
return true
}
当然,这是非常低效的,因为它在 haystack 上循环的arr次数与ss. 为了提高效率,您可以对 haystack 进行预处理,将其变成 a map[string]struct{},然后根据地图的键检查针头,如下所示:
func allInArray(ss []string, arr []string) bool {
present := make(map[string]struct{})
for _, a := range arr {
present[a] = struct{}{}
}
for _, s := range ss {
if _, ok := present[s]; !ok {
return false
}
}
return true
}
这会迭代arr
一次以创建查找映射,然后迭代ss
一次,利用映射的恒定查找时间来检查 的元素ss
是否存在于arr
.
TA贡献1815条经验 获得超13个赞
您可以使用我创建的支持 Some() 和 Every() 的https://github.com/ledongthuc/goterators来重用聚合和转换函数。但是对于您的情况,我认为您需要将同一个库与 Filter() 和 Exist() 结合使用。
package main
import (
"fmt"
"github.com/ledongthuc/goterators"
)
func main() {
arrays := [][]string{
{"some", "value"},
{"some", "value", "another"},
{"value", "another", "test"},
{"value", "test"},
{"some", "test"},
}
expected := []string{"some", "value"}
filteredItems := goterators.Filter(arrays, func(itemList []string) bool {
for _, expectedItem := range expected {
if !goterators.Exist(itemList, expectedItem) {
return false
}
}
return true
})
fmt.Println(filteredItems)
}
此库需要 Go 1.18 才能使用您想要使用的支持泛型 + 动态类型。
- 3 回答
- 0 关注
- 175 浏览
添加回答
举报