Go语言 忽略顺序时比较嵌套切片

ma8fv8wu  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(143)

在测试函数中,有一种情况需要比较嵌套的切片。假设我有两个变量,如下所示:

want := [][]string{{"bat"},{"nat","tan"},{"ate","eat","tea"}}
got := [][]string{{"eat","tea","ate"},{"tan","nat"},{"bat"}}

怎么能拿它们来比较呢?
首先,我使用了错误的reflect.DeepEqual,我还尝试了go-cmp

t.Run(tt.name, func(t *testing.T) {
        opt := cmpopts.SortSlices(func (a, b []int) bool {
            // not sure what to write
        })

        if got := groupAnagrams(tt.args.strs); !cmp.Equal(got, tt.want, opt) {
            t.Errorf("groupAnagrams() = %v, want %v", got, tt.want)
        }
    })
9nvpjoqh

9nvpjoqh1#

排序内部切片:

for _, s := range want { sort.Strings(s) }
for _, s := range got { sort.Strings(s) }

排序外部切片:

sortOuter(want)
sortOuter(got)

其中sortOuter是一个函数:

func sortOuter(s [][]string) {
    sort.Slice(s, func(a, b int) bool {
        sa := s[a]
        sb := s[b]
        n := len(sa)
        if n > len(sb) {
            n = len(sb)
        }
        for i := 0; i < n; i++ {
            if sa[i] != sb[i] {
                return sa[i] < sb[i]
            }
        }
        return len(sa) < len(sb)
    })
}

比较:

fmt.Println(reflect.DeepEqual(got, want))

https://go.dev/play/p/SjN8gLmotjd

bkhjykvo

bkhjykvo2#

您可以使用sort.Slice对内部切片进行排序,如下所示,并使用testifyassert.ElementsMatch检查外部切片是否相等:

func TestXxx(t *testing.T) {
  // Slices
  want := [][]string{{"bat"}, {"nat", "tan"}, {"ate", "eat", "tea"}}
  got := [][]string{{"eat", "tea", "ate"}, {"tan", "nat"}, {"bat"}}

  // Running tests
  t.Run("test", func(t *testing.T) {
    // Sorting got inners
    for _, inner := range got {
      sort.Slice(inner, func(i, j int) bool {
        return inner[i] < inner[j]
      })
    }

    // Sorting want inners
    for _, inner := range want {
      sort.Slice(inner, func(i, j int) bool {
        return inner[i] < inner[j]
      })
    }

    // Match
    assert.ElementsMatch(t, got, want)
  })
}

元素匹配:
ElementsMatchAssert指定的listA(array,slice...)等于指定的listB(array,slice...),忽略元素的顺序。如果有重复的元素,则它们在两个列表中出现的次数应该匹配。
[1,3,2,3],[1,3,3,2]中的一个或多个元素。

相关问题