2017年11月25日土曜日

Kotolin in Android アプリ

Android版勝率カウンタですが、前にも言った通りKotlinという言語で書いてます。
便利だなー、と思うところをつらつらと書いていきます。

ソース見ながら適当に書くので順番は適当です。

EventListnerが簡単に書ける。
findViewById<Button>(R.id.buttonKill).setOnClickListener{
    kill++
    updateText() 
}
Killボタン押したときの動作ですね。
簡単な動作をシンプルに書けます。

when:場合分けがわかりやすく書ける
nowArp -=when (nowArp){
    in 0..99->0
    in 100..299->5
    in 300..699->6
    in 700..1199->10
    in 1200..1999->15
    else ->20
負けた時のARPの変化です。
現在のランクによって減るポイントが異なるのですが、範囲を条件にできるので簡潔に書けます。
また、値を返すことができるのも便利ですね。
ランクの割り出しも場合分けが多いですが同様にやってます。

コレクションの操作が楽しい
setRate(R.id.forestRate,{it.stage==textForest})
setRate(R.id.forestTodayRate,{isToday(it.date)&&it.stage==textForest})
private fun setRate(id:Int,f:(Record)->Boolean) {
    val r=app.records.filter { f(it)}
    val win=r.count{it.result==textWin}
    val count=r.count()
    val s =if (count != 0) {"%.1f%%".format(win * 100.0 / count)} else ""
    findViewById<EditText>(id).setText(s)
}
勝率の計算はこんな感じでやってます。

recordsが RecordクラスのListになっていて、全結果を保持しています。
そこでステージ、日付、結果でfilterをかけて当日、トータルの勝率を割り出しています。
コレクションの操作自体はC#のLINQで知ったのですが、こちらの書式のほうが好きですね。

コレクション操作でもう一個肝なのがグラフ作成時ですね
val list= mutableListOf<CandleEntry>()
val dayList=app.records.map{ Record.getDay(it.date)}.toSet()

val yAxis= mutableListOf<String>()

for((index,day) in dayList.withIndex()){
    val dayData=app.records.filter { Record.getDay(it.date)==day }
    val start=dayData.first().old_arp
    val end=dayData.last().arp
    val max=dayData.maxBy{it.arp}!!.arp
    val min=dayData.minBy{it.arp}!!.arp
    list.add(CandleEntry(index.toFloat(),max.toFloat(),min.toFloat(),start.toFloat(),end.toFloat()))
    yAxis.add(day)
}
ろうそく足チャート用のデータ作成です。
まずX軸用のラベルdayListを作成。mapで日付だけのリストをつくってtoSetで重複削除。
Y軸用データは日付ごとのRecordリスト:dayDataを取得してその中から開始値、終了値、最大値、最小値を割り出していきます。

後、ちょこちょこと出てきてますが強力な型推論は便利です。
変数定義時に型名を書かなきゃいけないのはほとんどないし、間違えるとすぐ警告が出るので助かります。

実際のところ、そんなにプログラムの知識もないし深く考えないので、これでいいのかどうか不安になりつつやってます。
解説にもなってないとは思いますがこんな感じで楽しくいじっています。

0 件のコメント:

コメントを投稿