登录
首页 >  Golang >  Go问答

对带有重音字符的字符串键进行排序结构

来源:stackoverflow

时间:2024-02-20 09:12:54 226浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《对带有重音字符的字符串键进行排序结构》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我最近在尝试对包含法语字符串的键上的结构进行排序时偶然发现了一个问题。经典的 sort.slicestable 没有根据法国字母排序规则正确考虑重音字符。

值得庆幸的是,collat​​e 包可以正确执行此操作,但我无法找到一种方法来直接在结构上使用该包,而不将其与 sort.slicestable 函数结合使用。

这是我想出的似乎可以正常工作的方法:

2882​​27119644

此代码返回:

[{0 cote} {5 coter} {1 coté} {4 cotée} {2 côte} {3 côté}]
[{0 cote} {1 coté} {2 côte} {3 côté} {4 cotée} {5 coter}]

这是在大型结构上执行此操作的最有效方法吗?


解决方案


您的排序基于 less 函数,该函数仅调用 cl.comparestring()。你想要什么更简单的事情?您必须以某种方式/某处告诉您想要根据 fr 字段进行排序,这就是您可以做到这一点的方法。

sort.SliceStable() 是通用的,它可以对任何切片进行排序。为此,它必须在底层使用反射,这比不必诉诸反射的解决方案要慢。因此,如果你想对大片进行排序,实现 sort.Interface 是有利可图的。

var cl = collate.new(language.french)

type frslice []sortfr

func (s frslice) len() int           { return len(s) }
func (s frslice) less(i, j int) bool { return cl.comparestring(s[i].fr, s[j].fr) < 0 }
func (s frslice) swap(i, j int)      { s[i], s[j] = s[j], s[i] }

然后使用它:

s := []SortFr{
    // ...
}

sort.Stable(FrSlice(s))

另请注意,sort.Sort() 可能比 sort.Stable() 快一些,因为前者不必保证相等元素的原始顺序。因此,如果不需要保持相等元素的原始顺序,请使用 sort.sort()

今天关于《对带有重音字符的字符串键进行排序结构》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>