@konanomono (伝説の 粉)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Dartを使用したfor文

Q&A

Closed

解決したいこと

for, for in, forEachでListに格納された値にフィルタをかけ、フィルタした値を取得したいです。

List<int> box = [1,3,4,5,6]

というものがあったとしたら、3以上の値を返すために関数を作成し、引数にListを使用して作成しようと思ってます。

whereで取得できるのに、回りくどいと思いますが、どうやるか気になり質問を投稿しました。

※かなり試しましたが自分では回答が出せなかったためQiitaにいらっしゃるエンジニア様たちの、お力をお貸しください。。。

※下記みたいにやってみましたが、できませんでした。。。
何が悪いかもわかりません。。。何かアドバイス等もいただければ嬉しいです。。。

List<int> box = [1,2,3,6,7,8];
List<int>? mount(List<int> num2){
  for (var i = 0; i < num2.length; i++){
    if (i >= 5){
      print(num2);
    }
  }
}


List<int>? unmount(List<int> num3){
  for (var num3 in box){
    if (num3 >= 5){
      print(num3);
    }
  }
}
main(){
  print("------for------");
  mount(box);
  print("------for in------");
  unmount(box);
}
0 likes

1Answer

Dart を勉強中でいらっしゃるようなので細かく添削していきますね。

List<int>? mount(List<int> num2){
  for (var i = 0; i < num2.length; i++){
    if (i >= 5){
      print(num2);
    }
  }
}

まず、マウントと関係ない関数に mount と名付けるのは可読性の点でよくありません。フィルタしたリストを print するだけなら printFilteredList などにしてください。リスト型の引数名に num2 とつけるのも紛らわしいです。

返り値が List<int>? なのに関数が値を返していません。値を返さず print するだけなら void にすべきです。フィルタした値を返すのが本来の意図なら、値を返してください。

関数の中身は意図と大きく離れています。何が悪いかわからないときは日本語に直して考えてみてください。

整数のリストを返すか何も返さない関数 mount(整数のリスト num2) {
  i 0を代入し、 i  num2 の長さより小さい間ループ。各周回の終わりに i 1ずつ増やす {
  // ↑「i に0から (num2 の長さ - 1) までの整数を順々に代入してループする」
  // と読み替えると分かりやすい
    もし i 5以上なら {
      num2 を表示する
    }
  }
}

この関数の内容を一言で要約すると、「リスト num2 の長さが5以上なら、(長さ - 5)回だけ num2 を表示する」となります。フィルタではなくリスト全体を何回か表示する関数になっていますね。

条件に一致した値を表示するように直したいなら数箇所修正すればよさそうですが、それでは本来の意図であるフィルタにはなりません。フィルタとは、言い換えれば「受け取ったリストの要素を1つずつ調べて条件を満たす要素を見つけ、それらを新しいリストに詰めて返す」関数です。新しいリストを作り、要素を詰める方法を調べてみてください。

unmount() 関数にも間違いがありますが、これも日本語で考えると気づくかもしれません。

1Like

Comments

  1. @konanomono

    Questioner

    なるほどです。。。
    そういう事だったのですか、細かい添削ありがとうございます。
    プログラムを組む際に、日本語化しながら進めていきたいと思います。

    ありがとうございます。

Your answer might help someone💌