📘

配列処理の問題集(Dart)

12 min read 2

はじめに

Dart による記法で配列処理の問題集を作りました!問題は随時追加予定です。
是非、DartPad やお使いのエディタで解答なさってください。
また、至らない点や別解などございましたら、コメント欄にて教えてもらえると幸いです。

以前、JavaScript でも同じような問題集を作っておりますので、興味のある方はご覧になってください🙇

https://zenn.dev/tsuboi/articles/c4f17185a6181f013108

List型 → List型 or プリミティブ型

問題①

1から100までの数字が格納された List の作成をして下さい。

解答
void main() {
  final items = List<int>.generate(100, (i) => i + 1);
  print(items);
}

問題②

次の連想配列(images)のheightだけを取得し、新しい配列(heights)を作成して下さい。

void main() {
  final images = <Images>[
    const Images(height: '20px', width: '40px'),
    const Images(height: '34px', width: '56px'),
    const Images(height: '28px', width: '64px'),
  ];
  //ここに解答
}

class Images {
  const Images({
    required this.height,
    required this.width,
  });

  final String height;
  final String width;
}
解答
void main() {
  final images = <Images>[
    const Images(height: '20px', width: '40px'),
    const Images(height: '34px', width: '56px'),
    const Images(height: '28px', width: '64px'),
  ];

  final height = images.map((image) => image.height);
  print(height.toList()); //[20px, 34px, 28px]
}

class Images {
  const Images({
    required this.height,
    required this.width,
  });

  final String height;
  final String width;
}

問題③

次の連想配列(member)の中から名前(name)の値だけを抜き取った配列が返るような関数getNameを作成して下さい。

void main() {
  var members = <Members>[
    const Members(name: '松井', age: 39),
    const Members(name: '今田', age: 34),
    const Members(name: '鈴木', age: 24),
    const Members(name: '山田', age: 56),
    const Members(name: '田中', age: 89),
  ];
  //ここに解答
}

class Members {
  const Members({
    required this.name,
    required this.age,
  });

  final String name;
  final int age;
}

解答
void main() {
  var members = <Members>[
    const Members(name: '松井', age: 39),
    const Members(name: '今田', age: 34),
    const Members(name: '鈴木', age: 24),
    const Members(name: '山田', age: 56),
    const Members(name: '田中', age: 89),
  ];

  final getName = members.map((e) => e.name).toList();
  print(getName); //[松井, 今田, 鈴木, 山田, 田中]
}

class Members {
  const Members({
    required this.name,
    required this.age,
  });

  final String name;
  final int age;
}


問題④

以下の連想配列(users)の中から、管理者権限(admin)を持っている(true)ユーザーに絞り込み、adminUsersという変数に格納してください。

void main() {
  final users = <Users>[
    const Users(id: 1, admin: true),
    const Users(id: 2, admin: true),
    const Users(id: 3, admin: false),
    const Users(id: 4, admin: true),
    const Users(id: 5, admin: false),
  ];

  //ここに解答
}

class Users {
  const Users({
    required this.id,
    required this.admin,
  });

  final int id;
  final bool admin;
}

解答
void main() {
  final users = <Users>[
    const Users(id: 1, admin: true),
    const Users(id: 2, admin: true),
    const Users(id: 3, admin: false),
    const Users(id: 4, admin: true),
    const Users(id: 5, admin: false),
  ];

  final adminUser = users.where((user) => user.admin);
  print(adminUser.toList());
}

class Users {
  const Users({
    required this.id,
    required this.admin,
  });

  final int id;
  final bool admin;
}


問題⑤

次の多次元配列のインデックス0番目のみを取り出した配列を作成して下さい。

void main() {
  final array = <List<String>>[
    ['Ruffy', 'captain'],
    ['Zoro', 'combatant'],
  ];
  //ここに解答
}

解答
void main() {
  final array = <List<String>>[
    ['Ruffy', 'captain'],
    ['Zoro', 'combatant'],
  ];

  final indexZero = array.map((key) => key[0]);
  print(indexZero.toList()); //[Ruffy, Zoro]
}


問題⑦

次の連想配列(member)の中から35歳以上の名前(name)の値だけを抜き取った配列が返るような関数getNameOver35を作成して下さい。

void main() {
  final members = <Members>[
    const Members(name: '松井', age: 35, gender: 'male'),
    const Members(name: '今田', age: 34, gender: 'female'),
    const Members(name: '鈴木', age: 24, gender: 'male'),
    const Members(name: '山田', age: 56, gender: 'male'),
    const Members(name: '田中', age: 89, gender: 'female'),
  ];

  //ここに解答
}

class Members {
  const Members({
    required this.name,
    required this.age,
    required this.gender,
  });

  final String name;
  final int age;
  final String gender;
}

解答
void main() {
  final members = <Members>[
    const Members(name: '松井', age: 35, gender: 'male'),
    const Members(name: '今田', age: 34, gender: 'female'),
    const Members(name: '鈴木', age: 24, gender: 'male'),
    const Members(name: '山田', age: 56, gender: 'male'),
    const Members(name: '田中', age: 89, gender: 'female'),
  ];

  final getOveAger35 =
      members.where((member) => member.age >= 35).map((member) => member.name);
  print(getOveAger35.toList()); //[松井, 山田, 田中]
}

class Members {
  const Members({
    required this.name,
    required this.age,
    required this.gender,
  });

  final String name;
  final int age;
  final String gender;
}

問題⑧

以下のような重複値を含む配列arrの中から、重複する値を除く数が並ぶ配列を作成して下さい。

void main() {
  final arrNumbers = <int>[2, 4, 7, 5, 4];

  //ここに解答
}

解答
void main() {
  final arrNumbers = <int>[2, 4, 7, 5, 4];

  final numberSet = Set.from(arrNumbers);
  print(numberSet.toList()); //[2, 4, 7, 5]
}

問題⑨

次の連想配列の中からnameプロパティをもったユーザーに絞り、Listに格納されたgetNameという変数を作成して下さい。

void main() {
  const users = <User>[
    User(id: 1, name: '豊臣'),
    User(id: 2),
    User(id: 3, name: '織田'),
  ];
 
 //ここに解答
}

class User {
  const User({
    required this.id,
    this.name,
  });

  final int id;
  final String? name;
}

解答
void main() {
  const users = <User>[
    User(id: 1, name: '豊臣'),
    User(id: 2),
    User(id: 3, name: '織田'),
  ];
  final getName = users.where((element) => element.name != null);
  print(getName.toList());
}

class User {
  const User({
    required this.id,
    this.name,
  });

  final int id;
  final String? name;
}

問題⑩

以下の連想配列(users)の中から、管理者権限(admin)を持っている(true)ユーザーを探し、最初に見つけた(true)ユーザーをadminという変数に格納して下さい。

void main() {
  const users = <Users>[
    Users(id: 1, admin: false),
    Users(id: 2, admin: false),
    Users(id: 3, admin: false),
    Users(id: 4, admin: true),
  ];

  //ここに解答
}

class Users {
  const Users({
    required this.id,
    required this.admin,
  });

  final int id;
  final bool admin;
}
解答
void main() {
  const users = <Users>[
    Users(id: 1, admin: false),
    Users(id: 2, admin: false),
    Users(id: 3, admin: false),
    Users(id: 4, admin: true),
  ];

  final firstAdminUser = users.firstWhere((element) => element.admin);
  print(firstAdminUser);//4
}

class Users {
  const Users({
    required this.id,
    required this.admin,
  });

  final int id;
  final bool admin;
}


問題⑫

アンケートを実施した結果がusersという連想配列に格納されています。ユーザー全員が回答済みかどうかを確認し、hasSubmitted変数に結果(trueかfalse)を示して下さい。

expect: false

void main() {
  final users = <Users>[
    const Users(id: 0, hasSubmitted: true),
    const Users(id: 1, hasSubmitted: true),
    const Users(id: 2, hasSubmitted: true),
    const Users(id: 3, hasSubmitted: false),
  ];

  //ここに解答
}

class Users {
  const Users({
    required this.id,
    required this.hasSubmitted,
  });

  final int id;
  final bool hasSubmitted;
}

解答
void main() {
  final users = <Users>[
    const Users(id: 0, hasSubmitted: true),
    const Users(id: 1, hasSubmitted: true),
    const Users(id: 2, hasSubmitted: true),
    const Users(id: 3, hasSubmitted: false),
  ];

  final everyHasSubmitted = users.every((element) => element.hasSubmitted);
  print(everyHasSubmitted);//false
}

class Users {
  const Users({
    required this.id,
    required this.hasSubmitted,
  });

  final int id;
  final bool hasSubmitted;
}


問題⑬

次のtripという連想配列に格納されたdistanceの合計を求めて、totalDistanceという変数に格納して下さい。

void main() {
  final trips = <Trips>[
    const Trips(distance: 34),
    const Trips(distance: 12),
    const Trips(distance: 1),
  ];

  //ここに解答
}

class Trips {
  const Trips({required this.distance});

  final int distance;
}

解答
void main() {
  final trips = <Trips>[
    const Trips(distance: 34),
    const Trips(distance: 12),
    const Trips(distance: 1),
  ];

  final totalDistance = trips.fold(0, (int prev, acc) => prev + acc.distance);
  print(totalDistance); //47
}

class Trips {
  const Trips({required this.distance});

  final int distance;
}

//別解
void main() {
  final trips = <Trips>[
    const Trips(distance: 34),
    const Trips(distance: 12),
    const Trips(distance: 1),
  ];

  final totalDistance =
      trips.reduce((a, b) => Trips(distance: a.distance + b.distance));
  print(totalDistance.distance); //47
}

class Trips {
  const Trips({required this.distance});

  final int distance;
}


問題⑭

次の変数engineersに格納されたエンジニアの種類(フロントエンド、バックエンド)の数を種類を集計し、一つのオブジェクトに格納して下さい。

void main() {
  final engineers = <Engineer>[
    const Engineer(type: 'backend'),
    const Engineer(type: 'backend'),
    const Engineer(type: 'frontend'),
    const Engineer(type: 'frontend'),
    const Engineer(type: 'backend'),
    const Engineer(type: 'backend'),
  ];

  //ここに解答
}

class Engineer {
  const Engineer({required this.type});

  final String type;
}

class EngineerType {
  EngineerType({this.frontend = 0, this.backend = 0});

  int frontend;
  int backend;
}
解答
void main() {
  fianl engineers = <Engineer>[
    const Engineer(type: 'backend'),
    const Engineer(type: 'backend'),
    const Engineer(type: 'frontend'),
    const Engineer(type: 'frontend'),
    const Engineer(type: 'backend'),
    const Engineer(type: 'backend'),
  ];

  //解答
  final result =
      engineers.fold(EngineerType(), (EngineerType? curr, Engineer? element) {
    if (element?.type == 'frontend') {
      curr?.frontend++;
    } else {
      curr?.backend++;
    }
    return curr;
  });
  //

  print(result?.backend); //4
  print(result?.frontend); //2
}

class Engineer {
  const Engineer({required this.type});

  final String type;
}

class EngineerType {
  EngineerType({this.frontend = 0, this.backend = 0});

  int frontend;
  int backend;
}

Map型 → List型

問題⑮

次のMap型の変数mapからkeyのみ、valueのみを格納したList型の変数keys,valuesを作成してください。

void main() {
  final map = <String, String>{
    'key0': 'value0',
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3',
  };

  //ここに解答
}
解答
void main() {
  final map = <String, String>{
    'key0': 'value0',
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3',
  };

  final keys = map.entries.map((item) => item.key).toList();
  final values = map.entries.map((item) => item.value).toList();
}

Discussion

ありがとうございます。foldは知らなかったので、勉強になりました。
別解を載せておきます。

問題⑦
回答ですと、35歳を超える人(「以上」ではなく)ですね。

問題⑧
print(arrNumbers.toSet().toList());

問題⑬
print(trips.map((p)=>p.distance).reduce((a,b)=>a+b));

問題⑮
print(map.keys);
print(map.values);

あと、クラス名は単数形の方が良いかも、です。
Engineers→Engineer

コメントありがとうございます!

また訂正箇所や別解の記載ありがとうございます。

問題⑦については問題文は変えず、コードを>= 35に変更致しました!

ログインするとコメントできます