LoginSignup
2
3

More than 1 year has passed since last update.

Dartの基礎を勉強しました(3)

Last updated at Posted at 2021-10-30

これまで勉強してきたもの

これまで、投稿してきたものはぁ!!!!!
・基本的な操作、[Hello World!]の出力
・変数
・条件分岐
上記の三つですね。

これだけでは、まだまだ作れるものは少ないですね。
はい、という訳で今回はリスト、Set、Mapについてやっていきましょうか。
ここから、Dartのバージョン変更で導入された[Null-safety]というものがあります。
Null-safetyが嫌ダァ!!という方もいれば、便利やん!!という方もいます。

まぁ、一緒に慣れていきましょう!!!!

※本段に入る前にNull-safetyに触れていきましょうか。

Null-safetyとは?

さて、Dartの公式サイトや様々なサイトを見て解説していきましょう。
※解説というより、引用が近いかな。。。?

まぁ、いいでしょう。初めていきましょう。

null-safetyを簡単に表すと

実行時に、Nullが原因のエラー NullPointerExceptionを発生させない仕組みのことです。Null安全とも。

これを見るに、ヌルポを起こさせないように、導入した機能のようですね。

次に、Null safetyは以下の三つの設計原則に基づいているそうです。

○変数はデフォルトでNon-Null
○段階的に採用可能
 ・同じプロジェクト内で、Nullable と Non-Nullを混在させながら段階的に移行可能。
 ・移行のツールも用意されている。
○健全生
 ・DartのNull Safetyが健全であり、コンパイラの最適化が可能です。
 ・プロジェクト全体、また依存関係を Null Safety に移行するとバグの現象以外にも、バイナリサイズ減少、実行速度改善などメリットがある。

こんな感じで概念的なのは「なんとなぁぁぁ。。。。く理解した!!」と思う人も少なくないでしょう。
ですが、実際にやってみると「何でこんなとこでエラーが。。。?」と思うこともありますので実際にやっていきましょう。

リスト(List)

リストは、簡単に表すと「一連の値を格納しておくための変数」です。
え、なにそれ。。。と言われると思う方もいますよね。
もっと簡単にいると、要素を書いた紙のようなものを考えるとわかりやすいかもしれませんね。
実際にコードを書いて見える化していきましょう。

リストのコードを書いてみよう

リストのコードを細かく見ていきましょう。

まずは、リストに値を格納してみましょう。

void main(){
  var name = ["犬","猫","鳥","魚","牛","豚","粉"];
}

リストに格納する場合は[]を使いましょう。
上記の場合は最初からリストに値が格納されている状態に
なります。

では、リストから値を取得しましょう。

void main(){
  var name = ["犬","猫","鳥","魚","牛","豚","粉"];
  print(name);
  print(name[1]);

//--------出力結果----------
//[犬, 猫, 鳥, 魚, 牛, 豚,粉]
//猫
}

このようにして、値を取り出します。
では、なぜこのように出力されるかを解説しましょう。

まず、print(name)はvarで型推論したリスト全体を出力します。
これは、簡単ですね。

次に、print(name[1])です。
これは、nameのリストから何番目の値を取得してくださいという意味です。

プログラミング初心者の方が見ていたら、混乱するかもしれないので記載しておきますが、要素の始まりは[0]からです。

1, 2, 3, 4, 5, 6, 7, 8, 9, .......

ではなく

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ........

こうなります。

よって、print(name[1])の時に[猫]が出力されている
というわけです。

され、リストのほうの話に戻りましょう。
先ほどのものはリストに値が格納されている状態でしたが、
今度は空のリストを定義して、そこに値を格納していきましょう。

void main(){
  var list1 = <int>[];
}

こんな感じで、空のリストを定義します。
もう少し解説しましょう。

var list1 = <格納する変数>[];

変数を定義しない場合は<>の部分をなしで以下のように
定義してください。

var list1 = [];

こんな感じですね。
今回格納する変数は、int型にしましょうか。
では、int型で空のリストを定義し、値を格納してみましょう。

void main(){
  list1.add(123);
  list1.add(456);
  list1.add(789);
  print(list1);
}
//-------出力--------
//[123, 456, 789]

こんな感じです。
int型で定義を行なったので、String型などを、入れてしまうと、エラーになってしまうので注意しましょう。

もちろんlistを定義する時に、String型で定義することで使用できます。
逆にString型で定義した時には、int型は格納できません。

さて、追加でリストに一旦追加した値を書き換える方法を解説しましょう。

リストの値を書き換えるのは、単純です。
コードで見ていきましょう。

void main(){
  list1.add(123);
  list1.add(456);
  list1.add(789);
  list1[1] = 109; //リストの1の値を109に書き換え
  print(list1);
  print(list1[1]);

//------出力-------
//[123, 109, 789]
//109

このようになりますね。
list[1] = 入れたい値;
リスト名を指定して、入れたい値を記載する。

そうすると、先に格納してあった値と書き変わります。
まぁ・・・だからどうしたぁ!?って感じですが、こういう方法で入れ替えるよって話なので「あぁ、こんなのもあるのね」で構いません。

され、あとはリストで使えるプロパティ、メソッドを書いて
リストの解説は終わりにしましょう。

プロパティ

プロパティ 意味 使用例
first Listの先頭の値を戻り値として返す print(test.first)
last Listの最後の値を戻り値として返す print(test.last)
isEmpty 値がない場合はtrueを、値がある場合はfalseを返します print(test.isEmpty)
length Listの長さを返します print(test.length)
reversed Listの値の順番を逆にして返します print(test.reversed)

メソッド

メソッド 意味 使用例
add(値) Listの最後に新しい値を追加します test.add(値)
addAll(List<変数> 値) Listの最後に新しいList型の値を追加します test.addAll([値])
insert(listに格納する場所, 値) Listの指定した番号(index)に値を挿入する test.indsert(listに格納する場所, 値)
insertAll(listの指定した場所, list<変数> 値) listの指定した場所に新しいlist型の値を挿入する test.insertAll(listに格納する場所, list<変数> 値)
remove(値) 指定した値をListから削除する(複数同じ値がある場合、Listの低い方が削除されます) test.remove(値)
removeAt(listの番号) 指定した場所の値をlistから削除する test.removeAt(listの番号)
removeLast() listの最後の値を削除し、削除した値を返します print(test.removeLast())
clear() listの値を全て削除します test.clear()
indexOf(値) 指定した値があるlist場所を返します(複数同じ値がある場合、list場所が低い方が返されます print(test.indexOf(値))
shuffle() listの値をシャッフルします。 test.shuffle()

もっと細かい解説を見たい方はこちらを

セット(Set)

セットです。
セットですね。
セットなんですよ。
・・・セットってなんだよぉ!!
という方も多いと思いますね。
私もそうです。

なので、少し調べて見ました。

Setを使えば、複数のvalue(データ)を格納し、valueを1つの固まり(コレクション)として操作できます。また格納したvalueを後から置き換えたり、追加したり、削除したりと自由にvalueを操作できます。(同じvalueを複数格納できません)

上記の文から私が得た解釈は複数のデータを格納し、扱えるということです!!!
...これだとリストと何が違うのかわかりませんよね。
はい...これだと本当にわかりませんね...。

ですが!!コードで書くと違いが、わかりますよ。

さて、では適当に自由型でいきましょう。
型の定義は、後で解説しましょう。

void main(){
  var set1 = {"重曹", 1.5, 19};
  set1.add("社畜");//セットした値の1番後ろに値を追加します。
  print(set1);
  set1.add("AI");//セットした値の1番後ろに値を追加します。
  print(set1);
  print(set1.elementAt(0));

//------出力--------
//{重曹, 1.5, 19, 社畜}
//{重曹, 1.5, 19, 社畜, AI}
//重曹
}

/*
Set<変数> test = {};
これで、変数を定義したセットも作れます。
*/

セットについて少しずつ解説していきましょう。
Setはlistよりも値参照が特殊です。
(おかしいな。。。私には値参照しか、違いがわからない。。。)

上記のコードをよぉーく見てください。
Q.リストとセットで比較すると、どこが違うでしょうか。

A.リストの場合は「print(list[0])」で指定した値を取得できます。
セットの場合は「print(set.elementAt(0))」で値を取得できます。
この部分がまず違います。

あとはほぼ同じ。。。なんですねぇ。。。はい。。。
解説は以上なんですねぇ。。。はい。。。

では、基本のプロパティとメソッドを書いておきましょうか

プロパティ

プロパティ 意味 使用例
first Setの先頭の値を戻り値として返します print(test.first)
last Setの最後の値を戻り値として返します print(test.last)
isEmpty 値がない場合はtrue、値がある場合はfalseを返します print(test.isEmpty)
length Setの長さを返します print(test.length)

メソッド

メソッド 意味 使用例
add(値) Setの最後に新しい値を追加する test.add(値)
addAll(Set<指定する変数> 値 Setの最後に新しいList型のデータを追加 test.addAll({値})
remove(値) 指定した値をSetから削除します test.remove(値)
clear() Setの値を全て削除します test.clear()

マップ(Map)

さて、マップです。
マップは、値にKey(値が格納される場所の名前)を紐付けて格納する。紐づけられている値をセットとして操作できます。

さて、ではさくっとコードを書いていきましょうか。

/*
変数を指定しない場合
var map1 = {}

変数を指定する場合(Keyと値をセットにする)
Map<変数(値),変数(Key)> = {} 

空のMapを作る
var Map1 = {};
map1["粉"] = 19;
print(map1);
*/

void main(){
  var map1 = {"粉":19,
              "犬":1,
              "猫":2,
              "鳥":3};
  print(map1);
  print(map1["粉"]);
  map1["粉"] = 109;//ここで、格納してある値を変えます
  print(map1); //ここで、更新されているのがわかります
}

こんな感じですね。はい
値とKeyがセットになっているので、いいですね。。。!!
(ワザップではないです。(※ネタを知らない人には申し訳ありません!!))
さて、ここまで来ると作れるものを色々考えてしまいますね。
私の場合は、汎用型AIの作成を生涯の目標としているので、こんな感じで何かに「格納」できる機能は道具の一種としてみてしまいますね。

もっと細かく見たい方はこちらを

さて、Mapのプロパティとメソッドを書いて、最後の挨拶を書いてこの記事は終わりになります。

プロパティ

プロパティ 意味 使用例
isEmpty 値がない場合はtrue, ある場合はfalseを返します print(test.isEmpty)
length MapのKeyと値のペアの数を返す print(test.length)

メソッド

プロパティ 意味 使用例
addAll(Map型のデータ) Mapに新しいMap型の値を追加する test.addAll("hoge")
remove(key) 指定したKeyの値をMapから削除する test.remove("hoge")
clear() Mapの値を全て削除する test.clear()

以上です。では、また次回。

追記:ループ文(2021/11/3 追記)

ループ文を簡単にいうと、「指定した回数文繰り返す」ですね。
このループ文はやりたい処理を繰り返させるという目的で使われることが多いような気がしますね。

では、さくっとやっていきましょうか

通常のfor文

for(条件){ print(実行); }
のように書きますね。

え?これだけじゃわからない?

(えぇ、私もこれだけで説明された「何言ってんだこいつ。。。」と思いますね)

コードで見える化してみましょう

void main(){
  for (int i = 0; i < 10; i++){
    print(i)
  }
}

はい、こんな感じですね。
簡単に解説しますと、iを0から10未満まで繰り返すということですね。
実際にコードを実行すると0~9まで繰り返されます。

リストを使用したfor文

では、リストを使ったものをやってみましょうか
簡単にいうと、リストの中身を出力するって感じですね。
コードを書いてみましょうか。

void main(){
  var names = ["粉","砂糖","塩","小麦粉"];
  for (var name in names){
    print(name);
  }
}

このような形になります。

while文を使用した繰り返し

これは、whileを使用しているものです。
コードを見れば処理はわかるので、処理内容は解説いらないかもしれませんね。
では、コードで見える化しましょう。

void main(){
  int i = 0;
  while (i < 10) {
    print(i);
    i++;
  }
}

はい、ではループ文の解説は終わりです。

挨拶

どうも、組込みエンジニアとして、とある企業におります粉です。

・組込みエンジニアですがAIエンジニア、機械学習エンジニアとして転職したいので、自身でいろいろと勉強を行っております。

・なんでAIエンジニアや機械学習エンジニアになりたいの?と疑問をもたれる方も多いと思いますので、簡単に説明させていただきます。
1、元はAIを作ってみたい、社会問題、労働に関してもっと働きやすい環境が必要なのではないか?と考えたため様々な課題をAIなどの先端技術でアプローチをかけてみたいと思い、AIエンジニアを目指しました。
2、ですが、今やっているのは組込みエンジニアのため、使用する技術、言語が違うといったことから、独学でやってみようと思いまして、最近勉強をはじめました。
3、転職を目指す、自身の夢を叶えたいという願いもありますので、こうやって学んだことを記事しています。

・いろいろとお話ししましたが、まずは、私よりも知識、技術が豊富な先輩方から多くのことを意見、修正点、アドバイスをいただけることを楽しみにしています。

・まだまだ新参者、理解が足りていない部分もあるので記事を書きながら、修正を繰り返して理解を深めれればと思っております。(AIを研究している企業や研究機関に転職したいです。

・こんな手法もあるぞ、やり方はこうだ!!などの意見も募集しております。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3