美文网首页
golang排序二维切片

golang排序二维切片

作者: 克罗地亚催眠曲 | 来源:发表于2020-08-30 20:09 被阅读0次

排序二维切片,思路算是比较明确,但是中间由于某些细节没有处理好,导致调试了很久才写出正确的版本。

type tds [][]string

func (d tds) Len() int {
    return len(d)
}

func (d tds) Swap(i, j int) {
    d[i], d[j] = d[j], d[i]
}
func (d tds) Less(i, j int) bool {
    n := len(d[i])
    for k := 0; k < n; k++ {
        if d[i][k] < d[j][k] {
            return true
        } else if d[i][k] == d[j][k] {
            continue
        } else {
            return false
        }
    }
    return false
}

func main() {
    fmt.Println("hello world")
    fmt.Println("dd" < "ab")
    t := [][]string{
        {"ba", "ab", "bc"},
        {"ab", "bc", "bb"},
        {"dd", "ac", "ab"},
    }
    sort.Sort(tds(t))
    fmt.Println(t)
}

出现失误的地方在于Swap函数中的for循环,一开始写的版本如下

func (d dts) Less(i, j int) bool {
  n := len(d[i])
  for k := 0; k < n; k++ {
    if d[i][k] < d[j][k] {
      return true
    }
  }
  return false
}

代码中的逻辑为,如果d[i][k] < d[j][k]就返回true,否则继续进行比较。咋一看没啥问题,然而这确实一个bug。这样的逻辑会将["bb", "aa"]["aa", "bb"]的Less操作返回true,而实际在检测到"bb" > "aa"时就应该返回false,而在错误的代码逻辑中没有返回,而是继续比较第二项“aa”bb,所以会返回错误的结果。

相关文章

  • golang 二维切片排序

  • golang排序二维切片

    排序二维切片,思路算是比较明确,但是中间由于某些细节没有处理好,导致调试了很久才写出正确的版本。 出现失误的地方在...

  • golang-101-hacks(13)——二维切片

    注:本文是对golang-101-hacks中文翻译。Go支持多维切片,再此只对二维切片切片做介绍。日常生活中通常...

  • Golang二维切片初始化

    Golang二维切片初始化 引言 之前,刷Leetcode的时候,有些题需要初始化二维数组,而一维数组的初始化,比...

  • golang sort.Slice

    sort.Slice是golang提供的切片排序方法, 其中使用到了反射(reflect)包 使用了闭包 可以参考...

  • the way to go:练习7.11和练习7.12

    golang学习,切片操作。 运行结果

  • Golang:切片

    切片(slice)是建立在数组之上的更方便,更灵活,更强大的数据结构。切片并不存储任何元素而只是对现有数组的引用。...

  • golang切片

    定义 slice 并不是数组或数组指针。它通过内部指针和相关属性引用数组片段,以实现变长方案。 使用方式 切片:切...

  • golang切片

    切片是对数组的抽象 slice 总是指向底层的一个 array。 slice 是一个指向 array 的指针,这是...

  • Golang:切片

    切片 切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。非常灵活,支持自动扩...

网友评论

      本文标题:golang排序二维切片

      本文链接:https://www.haomeiwen.com/subject/hcgesktx.html