2016-10-25 4 views
4

私は現在2つの配列を持っていて、どちらも5つのオブジェクトを含んでいます。すべてのオブジェクトにはInt個の変数が含まれています。2アレイから最大値をフィルタリングするKotlinの方法?

サンプルデータ:

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()という配列のメソッドを持っていることを知っています。

これは私が不思議に思っていた(現在、私は誰かがJavaのようにネストされたfor-loopを使用しています)、視覚的に美しいです Kotlinでそうするより速く/サンプルデータを使用して

予想される出力:

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

答えて

6

あなたは、2つの配列の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

+0

[OK]を、しかし、どのようにだろうこの値を解決するには、2つの値、 'number'と' name' feを含むオブジェクトがありますか? ( 'number'をソートしたい場合) – Ivaro18

+0

は、データクラスオブジェクト – Ivaro18

+1

で答えを編集しました。'(array1 + array2).sortedByDescending {it.number}のように 'sortedByDescending'を使うことができます。take(5) ' –

3

は、おそらくこれはあなたのユースケースに適合します:ここでは

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

(a + b)は、abの内容を持つ配列を作成すると、.sortedDescending()は配列を最大から最小にソートし、結果をリストに入れます。次に、.take(5)のトップアイテムを選択し、次に.toTypedArray()を配列に変換します。


クラスDemoComparable<Demo>でない場合は、次のことができます。

  • がため.sortedDescending()を適用するために、そのクラスにComparable<T>インタフェースを実装し、それ

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

    それからちょうど上記の溶液を使用します。

    val c = (a + b).sortedByDescending { it.number }.take(5).toTypedArray() 
    
  • 使用コンパレータチェーンを使用すると、複数の値による比較が必要な場合:データを比較する方法を指定する

  • 使用.sortedByDescending { }

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

Okですが、これは値が' number'と 'name'という2つの値を持つオブジェクトだったのでしょうか? ( 'number'でソートしたい場合) – Ivaro18

+0

は、データクラスオブジェクト – Ivaro18

+0

@ Ivaro18で解答を編集し、解答を更新しました。 – hotkey

関連する問題