首先按字母顺序对对象数组进行排序,然后按数字排序

Posted

技术标签:

【中文标题】首先按字母顺序对对象数组进行排序,然后按数字排序【英文标题】:Sort array of objects alphabetically first, and then by numbers 【发布时间】:2021-12-28 00:55:58 【问题描述】:

我有一个对象数组 (Drinks),其中包含一个 theDrinkName 字段。我希望能够先按字母顺序对 Drink 对象 theDrinkName 字段进行排序,然后再按数字排序。

这是我用来生成所有饮料的函数。

data class Drink(val theDrinkName:String)

object DrinkData 

    fun generateAllDrinks():Array<Drink> 
        return arrayOf(
            Drink("Vodka"),
            Drink("rum"),
            Drink("Gin"),
            Drink("151"),
            Drink("99")
        )
    
    

我按字母顺序(基于theDrinkName)使用以下内容对其进行排序:

val allDrinks = DrinkData.generateAllDrinks().sortedBy  it.theDrinkName.toLowerCase().first().toTypedArray()

for (drink in allDrinks)
    println(drink.theDrinkName)

这将打印以下内容:

151
99
Gin
rum
Vodka

默认情况下,它首先对数字进行排序,然后再按字母排序。如何先按字母,然后按数字对这些数据进行排序,如下所示:

期望的结果:

Gin
rum
Vodka
151
99

【问题讨论】:

【参考方案1】:

您可以先按第一个字符是否为数字的指示排序,然后按全名排序:

val allDrinks = DrinkData.generateAllDrinks().sortedWith(
    compareBy<Drink>  it.theDrinkName.first().isDigit() 
        .thenBy  it.theDrinkName.lowercase() 
)

【讨论】:

【参考方案2】:

另一种可能的解决方案: 您在单词之前获得数字的原因是字母表的 ASCII 值比数字大。您可以在单词前添加一个空格来降低它们的比较值并将其用于排序。

DrinkData.generateAllDrinks().sortedBy  drink ->
    drink.theDrinkName.lowercase().let  if (it[0].isDigit()) it else " $it" 

Playground

【讨论】:

以上是关于首先按字母顺序对对象数组进行排序,然后按数字排序的主要内容,如果未能解决你的问题,请参考以下文章

除数字外,如何按字母顺序对对象数组进行排序?

首先按频率对字符串中的字符进行排序,然后按字母顺序排序

按字母顺序对 NSDictionary 值进行排序

sql server 按字母顺序排序,然后是数字

按字母顺序对对象的 ArrayList 进行排序

首先按布尔列对数组进行排序,然后按字符串列排序