2016-10-25 1 views
4

Ich habe derzeit 2 Arrays, die jeweils 5 Objekte enthalten. Alle Objekte enthalten Int Variablen.Kotlin Art der Filterung von Max Werten von 2 Arrays?

Beispieldaten:

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

Was ich versuche zu tun, um eine Funktion erstellen, die diese Arrays auf den Maximalwert filtern. Jetzt weiß ich, dass Kotlin eine Methode auf ihrem Array max() hat, die den maximalen Wert des Arrays zurückgibt, auf dem es verwendet wird.

Das frage ich mich gemacht (zur Zeit bin ich mit verschachtelten for-Schleife wie jemand würde in Java.), Gibt es eine optisch schön schneller/besser Art und Weise so in Kotlin zu tun?

Erwartete Ausgabe mit Beispieldaten:

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

Antwort

6

Sie möchten die 5 größer int der beiden Arrays haben?

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

Mit editierten Antwort:

(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

+0

Ok, aber wie würden Sie auflösen das ist die Werte waren ein Objekt mit 2 Werten - 'number' und' name' fe? (wenn Sie nach 'number' sortieren wollen) – Ivaro18

+0

editiert die Antwort mit den Datenklassenobjekten – Ivaro18

+1

Sie können' sortedByDescending' für das wie '(array1 + array2) .sortedByDescending {it.number} verwenden.take (5) ' –

3

Wahrscheinlich wird dies Ihr Anwendungsfall passen:

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

Hier (a + b) erstellt ein Array mit dem Inhalt a und b, dann .sortedDescending() sortiert das Array von Maximum zu Minimum und legt das Ergebnis in Liste. Dann Sie .take(5) Top-Elemente, und dann .toTypedArray() konvertiert es zurück in Array.


Wenn Ihre Klasse Demo nicht Comparable<Demo> ist, können Sie:

  • Implementieren Comparable<T> Schnittstelle für diese Klasse für .sortedDescending() anwendbar zu machen, es

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

    Dann benutzen Sie einfach die Lösung oben .

  • Verwenden .sortedByDescending { } angeben, wie die Daten verglichen werden sollen:

    val c = (a + b).sortedByDescending { it.number }.take(5).toTypedArray() 
    
  • Verwenden Komparatoren Kette, wenn Sie Vergleich von mehreren Werten müssen:

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

Ok, aber wie würdest du das auflösen, wenn die Werte ein Objekt sind, das zwei Werte enthält -' number' und 'name' f.e.? (Wenn Sie nach "Nummer" sortieren möchten) – Ivaro18

+0

bearbeitet die Antwort mit den Datenklassenobjekten – Ivaro18

+0

@ Ivaro18, aktualisiert die Antwort. – hotkey

Verwandte Themen