¿Manera de Kotlin de filtrar valores máximos de 2 arrays?

Actualmente tengo 2 arrays, ambos contienen 5 objects. Todos los objects contienen variables Int .

Data de muestra:

 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 = ?? 

Lo que bash hacer es crear una function que filtre estas matrices en los valores máximos. Ahora sé que Kotlin tiene un método en su matriz llamado max() que devolverá el valor máximo de la matriz en la que se utiliza.

Esto me hizo preguntarme (actualmente estoy usando nesteds for-loop como lo haría alguien en Java). ¿Existe una forma visualmente hermosa más rápida / mejor de hacerlo en Kotlin?

Salida esperada usando datos de muestra:

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

¿Le gustaría tener los 5 mayores int de las dos matrices?

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

Con la respuesta editada:

 (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

Probablemente esto se ajuste a su caso de uso:

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

Aquí, (a + b) crea una matriz con el contenido de a y b , luego .sortedDescending() ordera la matriz de máxima a mínima y coloca el resultado en la list. Luego .take(5) elementos superiores y luego .toTypedArray() convierte de nuevo en matriz.


Si su Demo class no es Comparable<Demo> , puede:

  • Implementar la interfaz Comparable<T> en esa class para hacer que .sortedDescending() sea ​​aplicable para ello

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

    Entonces solo usa la solución de arriba.

  • Utilice .sortedByDescending { } para especificar cómo deben compararse los datos:

      val c = (a + b).sortedByDescending { it.number }.take(5).toTypedArray() 
  • Utilice la cadena de comparadores si necesita una comparación por valores múltiples:

      val c = (a + b) .sortedWith(compareBy<YourData> { it.number }.thenBy { it.name }) .takeLast(5).reversed() 
  • Kotlin sorting array de una class basada en una var dentro de la class
  • ¿Cómo inicializar una matriz en Kotlin?
  • ¿Cómo comparar dos matrices en Kotlin?
  • Kotlin filter lambda array usando el índice de iteración
  • Inicializando matrices en kotlin
  • Inicialización de matriz de subprocesss múltiples en Kotlin
  • Kotlin - Cómo convertir String a ByteArray
  • Cómo usar la biblioteca kmongo para operador de sector
  • Llamadas seguras en Kotlin con Array es confuso
  • ¿Cómo crear una matriz vacía en kotlin?
  • Método igual para class de datos en kotlin