Kotlin способ фильтрации максимальных значений из 2 массивов?

В настоящее время у меня есть 2 массива, оба из которых содержат 5 объектов. Все объекты содержат переменные Int .

Пример данных:

 data class Demo(val number: Int, val name: String) val a = Demo(12, "a") val b = Demo(1, "b") val c = Demo(3, "c") val d = Demo(5, "d") val e = Demo(17, "e") val array1 = arrayOf(a,b,c,d,e) val f = Demo(3, "f") val g = Demo(8, "g") val h = Demo(15, "h") val i = Demo(16, "i") val j = Demo(22, "j") val array2 = arrayOf(f,g,h,i,j) //val array3 = ?? 

То, что я пытаюсь сделать, это создать функцию, которая будет фильтровать эти массивы на максимальных значениях. Теперь я знаю, что у Kotlin есть метод в их массиве с именем max() который вернет максимальное значение используемого массива.

Это заставило меня задуматься (в настоящее время я использую inested for-loop, как и кто-то на Java). Есть ли в Котлине визуально красивый быстрый / лучший способ?

Ожидаемый результат с использованием данных образца:

 array3[22,17,16,15,12] 

Вы хотели бы иметь 5 больших int двух массивов?

 (array1 + array2).sortedArrayDescending().take(5) // [22, 17, 16, 15, 12] 

С отредактированным ответом:

 (array1 + array2).sortedByDescending { it.number }.take(5) // [Demo(number=22, name=j), Demo(number=17, name=e), Demo(number=16, name=i), Demo(number=15, name=h), Demo(number=12, name=a)] 

http://try.kotlinlang.org/#/UserProjects/6eu172fogobv6na0mtafc9k9ol/klp8i0ttl32ip1q8ph3lk0s9bn

Вероятно, это будет соответствовать вашему варианту использования:

 val c = (a + b).sortedDescending().take(5).toTypedArray() 

Здесь (a + b) создает массив с содержимым a и b , затем .sortedDescending() сортирует массив от максимума до минимума и помещает результат в список. Затем вы .take(5) верхние элементы, а затем .toTypedArray() преобразует его обратно в массив.


Если ваш демон Demo не Comparable<Demo> , вы можете:

  • Внедрить Comparable<T> интерфейс в этом классе, чтобы сделать .sortedDescending() применимым для него

     class Demo(...) : Comparable<Demo>{ override fun compareTo(other: Demo): Int = number.compareTo(other.number) ... } 

    Затем просто используйте решение выше.

  • Используйте .sortedByDescending { } чтобы указать, как следует сравнивать данные:

      val c = (a + b).sortedByDescending { it.number }.take(5).toTypedArray() 
  • Используйте цепь компараторов, если вам нужно сравнить несколько значений:

      val c = (a + b) .sortedWith(compareBy<YourData> { it.number }.thenBy { it.name }) .takeLast(5).reversed()