質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

12816閲覧

kotlinにてListの要素を上書きする、もしくは削除してから追加する方法

tomuziso

総合スコア40

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2018/08/31 01:57

編集2018/08/31 02:41
hogeList.forEach { it.code }

で確認出来るcodeの値を持った要素を

newList.forEach { it.code }

という新しいListの要素に、もしcodeが一致すれば置き換えたいです。

hogeListに対してnewListの方もループを回してcodeが一致すれば「newListの該当した要素」に置き換えればと思いましたが、なかなかうまくいきません。
Listに対して変更を加えるときはどうすればいいでしょうか?

単純に上書きをやるのではなく、まず削除してからと思い、

hogeList.toMutableList().removeAll{ it.code == “100”} //試しにcodeを直接指定

と、やってみたものの、実際には削除されていませんでした。

上書き、もしくは削除してから追加が出来ればいいのですが、何かいい方法はあるでしょうか?
わかる方いましたら教えて頂けるとありがたいです。

情報追記

hogeList

[Hoge(code=0029, name=もげ, Id=1, value=すごい), Id=1, Hoge(code=0030, name=おげ, Id=1, value=すごい), Hoge(code=0031, name=ももげ, Id=1, value=すごい)]

newList

[Hoge(code=0029, name=もげ, Id=1, value=ふつう), Hoge(code=0031, name=ももげ, Id=1, value=よわい)]

こんな感じの2つのリストがあり、codeが一致すれば、newListの要素でhogeListを上書きしたいです。

出来れば、codeの一致判定をして、一致したら上書き。
または、codeが一致したらhogeListの方を削除し、newListの要素をplusしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/08/31 02:16

ちょっと分かりにくいので具体例を書いてもらえますか?とりあえずですが、変更するのではなく新しいListを作る方が簡単かもしれません。
tomuziso

2018/08/31 02:43

失礼しました。情報追記しました。確かに破壊的に変更するのではなく新しいリストを作ったほうが、実装的には良さそうです。
fuzzball

2018/08/31 02:50

「または、codeが一致したら」は「または、codeが一致しなかったら」の間違いでしょうか?(そうだとして、)それって newList そのものでは?
tomuziso

2018/08/31 02:58 編集

やりたいことというのが、結局は各要素のvalueの値を上書きしたい。ということです。その際newListにないcode(ここでは30)を持つ要素はそのまま。newListにあるcodeはnewListが持つvalueで上書きしたい、という感じです。分かりづらくてすみません。
fuzzball

2018/08/31 03:02

「codeが一致したらhogeListの方を削除し、newListの要素をplus」は「上書き」の説明ってことですかね?
tomuziso

2018/08/31 03:11 編集

「上書き」はListの中の要素にアクセスしてvalue = ”ふつう" みたいなvalueに直接代入の感じをイメージしていました。「または、」以降はHoge(code=0029, name=もげ, Id=1, value=すごい)をまるっと削除してから、Hoge(code=0029, name=もげ, Id=1, value=ふつう)を追加、という感じでした。
fuzzball

2018/08/31 03:51 編集

「newListにしか無い」パターンは無いですか?あるとしたら、それは追加しないですかね?
tomuziso

2018/08/31 03:57

「newListにしかない」パターンはひとまず想定していないので、追加もなしと考えています。
kakajika

2018/08/31 04:08

すみません、まだやり取りの途中だったのですね。。つい回答してしまいました
fuzzball

2018/08/31 04:27

そろそろkakajikaさんの回答が付く頃だと思ってましたw
tomuziso

2018/08/31 05:54

kakajikaさん、fuzzballさん、ありがとうございます!後ほど回答確認させてもらいます。
guest

回答2

0

Listの要素を別のものに置き換えた新しいListを作るには、mapを使います。mapの中で条件の判定をして要素を置き換えるかどうかを判断すればよいと思います。

kotlin

1val result = hogeList.map { old -> 2 // newListの中に条件を満たすものがあればそれに置き換え、なければそのまま 3 newList.find { it.code == old.code } ?: old 4}

投稿2018/08/31 03:55

kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomuziso

2018/09/07 00:34

回答ありがとうございます。コメント遅れて申し訳ありません。 mapの中でfindを使うことでcodeが存在すればnewListの要素取得。 findで取得出来なかったらnullが返るのでエルビス演算子で そのままの要素をmapの渡す、という感じで2つのリストをうまく比べ合わせながら判定できるのですね。 ループと言ったらforEachみたいな感じでしたが、mapやfindなどを組み合わせることによって、うまく欲しいデータが取れますね!大変勉強になりました。ありがとうございました!
guest

0

ベストアンサー

mapを使った回答が付いたので、回答者さんがやろうとしていた削除 & 追加での回答を書きたいと思います。

kotlin

1hogeList.toMutableList().removeAll{it.code ==100} //試しにcodeを直接指定

と、やってみたものの、実際には削除されていませんでした。

これはhogeListを書き換えるわけではありません。一時的に作られたhogeList.toMutableList()を書き換えるので、removeAllの処理後に消滅してしまいます。

kotlin

1val mutableHogeList = hogeList.toMutableList() 2mutableHogeList.removeAll {it.code == "100"}

これで mutableHogeListはcode == "100"の要素を削除したリストになります。

以上を踏まえて、

kotlin

1//更新のある要素を削除する 2val mutableHogeList = hogeList.toMutableList() 3newList.forEach { newObj -> 4 mutableHogeList.removeAll{it.code == newObj.code} 5} 6//更新のある要素を付け加える 7val updatedList = mutableHogeList + newList

※並び順変わります

投稿2018/08/31 04:26

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomuziso

2018/09/07 00:34

回答ありがとうございます。コメント遅れて申し訳ありません。 質問の不備など指摘して頂いてありがとうございます。 自分がやろうとしていた方法の解説ありがとうございます。 toMutableListの中でhogeListのmutable版を新しく作成して、そこに対してremoveAllをかけていたんですね。 hogeList自体が突然変異でmutableになったわけではなく、あくまでも新しいmutableなhogeListを返す、ということですね。初歩的なミスでした・・・。 これでforEachで一旦削除して〜という最初に考えていた流れでやることが出来ました。 大変勉強になりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問