【问题标题】: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

【问题讨论】:

    标签: android arrays sorting kotlin


    【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-31
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        • 2017-02-28
        • 2019-01-26
        相关资源
        最近更新 更多