Я знаю, что можно отсортировать список людей по свойству, используя следующий синтаксис:

persons = persons.sortedBy { person: Person-> person.name }

Теперь я хочу написать функцию сортировки, которая принимает свойство, по которому я хочу, чтобы список был отсортирован в качестве параметра.

В JavaScript я бы написал что-то вроде этого:

fun sort(property: String) { 
        persons = persons.sortedBy { person: Person-> person[property]} 
}

Но я не могу написать "person [property]" в Kotlin.

Итак, как я могу добиться такой функции сортировки в Kotlin?

0
TheDoctor 29 Авг 2020 в 19:28

2 ответа

Лучший ответ

Теперь я хочу написать функцию сортировки, которая принимает свойство, по которому я хочу, чтобы список был отсортирован в качестве параметра.

Будем надеяться, что по «свойству» вы можете согласиться на что-то вроде ссылки на функцию:

data class Person(val name: String, val age: Int)
  
var people = listOf(Person("Jane Doe", 25), Person("John Smith", 24), Person("Jen Jones", 37))

fun <R: Comparable<R>> sort(selector: (Person) -> R) {
  people = people.sortedBy(selector)
}

fun main() {
  println(people)
  sort(Person::name)
  println(people)
}

Я также мог бы использовать sort(Person::age), если бы хотел отсортировать по возрасту.

Если ваш псевдокод более буквальный и вам нужен параметр String для имени свойства, вам следует начать с вопроса «почему?». Но если вы чувствуете, что у вас есть законная причина использовать String, один из подходов будет:

data class Person(val name: String, val age: Int)
  
var people = listOf(Person("Jane Doe", 25), Person("John Smith", 24), Person("Jen Jones", 37))

fun sort(property: String) {
  people = when(property) {
    "name" -> people.sortedBy(Person::name)
    "age" -> people.sortedBy(Person::age)
    else -> throw IllegalArgumentException("and this is why you should not be doing this")
  }
}

fun main() {
  println(people)
  sort("name")
  println(people)
}
2
CommonsWare 29 Авг 2020 в 17:27
class CustomObject(val customProperty: String, val value:Int)

 val list = ArrayList<CustomObject>()
        list.add(CustomObject("Z",5))
        list.add(CustomObject("A",4))
        list.add(CustomObject("B",1))
        list.add(CustomObject("X",6))
        list.add(CustomObject("Aa",7))

        var alphabeticallySortedList = list.sortedWith(compareBy { it.customProperty })
        var numberWiseSortedList = list.sortedWith(compareBy { it.value })

0
Dharman 29 Авг 2020 в 17:24