想问一下“名称字母升序”这个是按什么原理排序的,还有为什么删了“2D”、“2d”两个文档还会改变其他文档的顺序啊,小白搞不懂啊 😭
相关帖子
-
silent-tan •订阅者
switch sortMode { case util.SortModeNameASC: sort.Slice(docs, func(i, j int) bool { return util.PinYinCompare(util.RemoveEmojiInvisible(docs[i].Name), util.RemoveEmojiInvisible(docs[j].Name)) }) case util.SortModeNameDESC: sort.Slice(docs, func(i, j int) bool { return util.PinYinCompare(util.RemoveEmojiInvisible(docs[j].Name), util.RemoveEmojiInvisible(docs[i].Name)) })
PinYinCompare 比较实现为:
func PinYinCompare(str1, str2 string) bool { // Doc tree, backlinks, tags and templates ignores case when sorting alphabetically by name https://github.com/siyuan-note/siyuan/issues/8360 str1 = strings.ToLower(str1) str2 = strings.ToLower(str2) a, _ := UTF82GBK(str1) b, _ := UTF82GBK(str2) bLen := len(b) for idx, chr := range a { if idx > bLen-1 { return false } if chr != b[idx] { return chr < b[idx] } } return true }
实际上在最终比较的时候,会转小写进行比较,所以大小写对比取决于在排序列表中的顺序。
而 golang 的 sort.Slice 方法虽然根据元素长度调用不同的排序算法,但是最终都会用到快排,而快排是不稳定的,不稳定的意思是两个相等的值排序之后的顺序可能和在原序列中的顺序不同。
看相关的技术文档说经过优化,sort 上面的排序方法性能差异不大,要不要改就看 @88250 老板了,或者,兄弟们,PR 的机会来了!!!
-
silent-tan • • 1 • 2 评论
不能修改评论,有点不习惯。具体的源码地址可以看:https://github.com/siyuan-note/siyuan/blob/d0fbace122f786c181c0fd5f6fc0a39e6999b762/kernel/model/file.go#L377
如果你说的是修改回帖,点击回帖右下角图标打开菜单是有编辑选项的@JeffreyChen ——!!! 真的很小,哈哈哈哈 - 其他回帖
-
switch sortMode { case util.SortModeNameASC: sort.Slice(docs, func(i, j int) bool { return util.PinYinCompare(util.RemoveEmojiInvisible(docs[i].Name), util.RemoveEmojiInvisible(docs[j].Name)) }) case util.SortModeNameDESC: sort.Slice(docs, func(i, j int) bool { return util.PinYinCompare(util.RemoveEmojiInvisible(docs[j].Name), util.RemoveEmojiInvisible(docs[i].Name)) })
PinYinCompare 比较实现为:
func PinYinCompare(str1, str2 string) bool { // Doc tree, backlinks, tags and templates ignores case when sorting alphabetically by name https://github.com/siyuan-note/siyuan/issues/8360 str1 = strings.ToLower(str1) str2 = strings.ToLower(str2) a, _ := UTF82GBK(str1) b, _ := UTF82GBK(str2) bLen := len(b) for idx, chr := range a { if idx > bLen-1 { return false } if chr != b[idx] { return chr < b[idx] } } return true }
实际上在最终比较的时候,会转小写进行比较,所以大小写对比取决于在排序列表中的顺序。
而 golang 的 sort.Slice 方法虽然根据元素长度调用不同的排序算法,但是最终都会用到快排,而快排是不稳定的,不稳定的意思是两个相等的值排序之后的顺序可能和在原序列中的顺序不同。
看相关的技术文档说经过优化,sort 上面的排序方法性能差异不大,要不要改就看 @88250 老板了,或者,兄弟们,PR 的机会来了!!!