golang排序二维切片

克罗地亚催眠曲 · · 969 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

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排序二维切片

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

969 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传