【问题标题】:How to sort by local strings letter sensitive?如何按本地字符串字母敏感排序?
【发布时间】:2018-09-11 20:15:19
【问题描述】:

假设我有像

这样的单词列表
a, b, c, ą, ć, z, ż

我想使用波兰语语言环境进行排序,例如:

a, ą, b, c, ć, z, ż

有可能实现吗?

更新:

假设我必须按两个对象参数对列表进行排序,并且还使用整理器。 对于我可以使用的一个属性:

val collator = Collator.getInstance(context.getResources().getConfiguration().locale)

myList.sortedWith(compareBy(collator,  { it.lastName.toLowerCase() }))

如何添加到此也按firstName 排序? (例如,如果有两个相同的lastName 则按firstName 对它们进行排序)

【问题讨论】:

    标签: kotlin functional-programming


    【解决方案1】:

    来自here

    试试这样的:

    val list = arrayListOf("a", "b", "c", "ą", "ć", "z", "ż")
    val coll = Collator.getInstance(Locale("pl","PL"))
    coll.strength = Collator.PRIMARY
    Collections.sort(list, coll)
    println(list)
    

    更新:

    让你的对象实现 Comparable:

    override fun compareTo(other: YourObject): Int {
        val coll = Collator.getInstance(Locale("pl","PL"))
        coll.strength = Collator.PRIMARY
        val lastNameCompareValue =  coll.compare(lastName?.toLowerCase(Locale("pl","PL")),other.lastName?.toLowerCase(Locale("pl","PL")))
        if (lastNameCompareValue != 0) {
            return lastNameCompareValue
        }
        val firstNameCompareValue =  coll.compare(firstName?.toLowerCase(Locale("pl","PL")),other.firstName?.toLowerCase(Locale("pl","PL")))
        return firstNameCompareValue
    }
    

    试试这个。

    【讨论】:

    • 谢谢,你能看到我更新的问题吗?也许你知道如何结合你之前给我的这个答案
    • @Konrad 你应该在你的对象中实现可比较的接口,并在 compareTo 方法中执行该逻辑
    • 仍然不确定这对我有什么帮助 - 我仍然无法按两个属性和整理器对它们应用排序
    • 这是一个很好的解决方案。唯一的问题是当我需要其他 Collat​​or 时怎么办?通常它是由 Context 提供的,但是在一些实现了 Comparable 的数据类对象中很难有上下文
    • @Konrad 你可以通过创建一个 Application 类(如果你没有的话)并从那里获取实例来获取上下文,所以你可以做类似val context = MyAppClass.getInstance()
    猜你喜欢
    • 2016-04-13
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多