首先按字母顺序对对象数组进行排序,然后按数字排序
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
【讨论】:
以上是关于首先按字母顺序对对象数组进行排序,然后按数字排序的主要内容,如果未能解决你的问题,请参考以下文章