testkun123
@testkun123 (T K)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

forEachで配列が作成できず困っています

解決したいこと

forEachでステータスの配列を作成したいのですが、最後のステータスのみしか変数に格納できていません。
配列の格納方法が間違っているのでしょうか?
解決方法を教えて下さい。

該当コード

LoginViewModel.kt

        // ステータス配列作成
        pref.statuses?.forEach {
            println(it.statusName)
            MyApplication.statusNameArray = arrayListOf(it.statusName)
        }

MyApplication.kt(グローバル変数保存ファイル)

package jp.workerapp

import android.app.Application
import jp.workerapp.network.HttpClient

/**
 * アプリ起点
 * アプリ起動時の処理、グローバル変数保存
 */
class MyApplication : Application() {
    companion object {
        lateinit var instance: Application
            private set

        // ログイン中のアクセスキーを保存
        var loggedInAccessKey: String? = null
        var workerId: String? = null
        var latitude: Double? = null
        var longitude: Double? = null
        var barcode: String? = null
        var statusNameArray: ArrayList<String>? = null
    }

    override fun onCreate() {
        super.onCreate()

        // Context取得用
        instance = this

        // HTTPクライアント初期化
        HttpClient.initRetrofit()
    }
}

追加画像

スクリーンショット 2022-07-05 20.51.14.png

自分で試したこと

自分なりに検索し、さまざまな方法を調べてみましたが上手くできませんでした。

0

2Answer

もう解決しているので何ですが、あるコレクションを別のコレクションに変換したいときは map が便利です。

2Like

Comments

  1. @testkun123

    Questioner

    教えていただきありがとう御座います。
    勉強になります!

Kotlinはわからないですが、
arrayListOfは配列の初期化に使用するのでは?
この二つの出力が正常なら初期化していることが原因ですが。。。


pref.statuses?.forEach {
           //ここの出力はどうなっていますか。正常なら
           println(it.statusName)
           MyApplication.statusNameArray = arrayListOf(it.statusName)
           //追加 ここの出力はどうなりますか?
           println(MyApplication.statusNameArray.contentToString())
       }

1Like

Comments

  1. @testkun123

    Questioner

    ご返信いただきありがとう御座います。
    画像のような結果になりました。
    初期化していることが原因でしょうか?
  2. 上の説明でarrayOfを使ってしまいましたが
    サンプルコードと実行結果(List)
    ListはlistOf関数で作成します。読み取り専用のため、変更しようとするとエラーとなります。

    サンプルコードと実行結果(Array)
    ArrayはarrayOf関数で作成します。Arrayは要素の値の変更や、要素の追加が可能です。

    @testkun123さんのコードでは、listOf関数を使っていて、
    一度の初期化で宣言する必要があります。
    "CPU", "Memory", "Mouse"をlistOf関数にセットする場合
    var mylist = listOf("CPU", "Memory", "Mouse")

    引用元
    https://techacademy.jp/magazine/32265
  3. 上のは
    arrayListOf と listOf関数を間違えましたすいません。

    ```ruby:qiita.rb

    pref.statuses?.forEach {
    //ここの出力はどうなっていますか。正常なら
    println(it.statusName)
    MyApplication.statusNameArray += arrayListOf(it.statusName)
    //追加 ここの出力はどうなりますか?
    println(MyApplication.statusNameArray.contentToString())
    }


    ```


    MyApplication.statusNameArray += arrayListOf(it.statusName)

    +=
    に変更で問題なく動くかと


    引用元
    https://runebook.dev/ja/docs/kotlin/api/latest/jvm/stdlib/kotlin.collections/array-list-of
  4. @testkun123

    Questioner

    ご丁寧にご回答いただきありがとうございます。
    お陰様で希望の値を取得することができました!
    本当にありがとうございました。
  5. 補足として、

    println(MyApplication.statusNameArray.contentToString())
    を初期化するとき、しないときの出力結果 [ ]に囲まれたの
    を比較すると追加されているのがわかると思います。
    このように取り敢えず、出力して値が求めているものか確認することを、お勧めします。

Your answer might help someone💌