📘
配列処理の問題集(Dart)
はじめに
Dart
による記法で配列処理の問題集を作りました!問題は随時追加予定です。
是非、DartPad やお使いのエディタで解答なさってください。
また、至らない点や別解などございましたら、コメント欄にて教えてもらえると幸いです。
以前、JavaScript
でも同じような問題集を作っておりますので、興味のある方はご覧になってください🙇
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
に変更致しました!