プログラミングド素人のデザイナーがJava入門してみた_その9

## 前回までのあらすじ
[プログラミングド素人のデザイナーがJava入門してみた_その8](http://qiita.com/iwashi0830/items/638931275966171981d2)

## Mathクラス,Randomクラス
- 数値を扱うクラス
- よく使うメソッド

### Mathクラス

|Math.ceil()|Math.floor()|Math.round()|Math.PI|Math.random()|
|:--:|:--:|:--:|:--:|:--:|
|切り上げ|切り捨て|四捨五入|円周率|乱数(Randomクラスの方がよい)|

```java
double d = 123.456;

System.out.println(Math.ceil(d));//小数点以下を切り上げ
System.out.println(Math.floor(d));//小数点以下を切り捨て
System.out.println(Math.round(d));//四捨五入
System.out.println(Math.PI);//円周率
```

### Randomクラス
- Randomクラスはjavaのutilパッケージ内にあるため、使うにはインポートする必要がある
- Randomクラスの**インスタンスを作らないと使えないメソッド**(クラスメソッドではない?)

|r.nextDouble()|r.nextInt(n)|r.nextBoolean()|
|:---:|:---:|:---:|
|0 ~ 1未満の浮動小数点数|0 ~ n未満の整数|`true` or `false`|

```java
import java.util.Random; //Randomクラスをimport

~中略~

  Random r = new Random();//インスタンス化
  System.out.println(r.nextDouble());//0 ~ 1未満の浮動小数点数
  System.out.println(r.nextInt(100));//0 ~ 100(引数の値)未満の整数
  System.out.println(r.nextBoolean());//true or false
```

##ArrayListクラスを使う
- 配列のようなものだが、あとから要素を追加,削除することができる
- 使うにはjavaのutilパッケージからのインポートが必要
- ArrayListはジェネリクス(引数の値を指定して使う)を使った型
- Listインターフェースを実装したクラス
- ArrayListだけが持つメソッドを使う機会はあまりないので、ArrayListが実装しているListインターフェースで宣言することもある

|al.add(n)|al.set(x,y)|al.remove(n)|al.seze()|
|:---:|:---:|:---:|:---:|
|ArrayListの要素にnを追加する|x番目の項目にyを追加する|n番目の項目削除する|要素の数を取得|

```java
import java.util.*;//utilパッケージ内のクラスを全てインポート

// ArrayList<Integer> sales = new AllayList<>();
// 今回はListクラスで宣言
List<Integer> sales = new ArrayList<>();

sales.add(10);
sales.add(20);
sales.add(30);

sales.set(0,100);
sales.remove(1);

// for(int i = 0; i < sales.size(); i++){
//   System.out.println(sales.get(i));
// }

for(Integer sale : sales){
  System.out.println(sale);
}
```

- ArrayListクラスと同様にListクラスを実装した**LinkedList**クラスがある
- できることは同様だが、下記のような違いがある

|ArrayListクラス|LinkedListクラス|
|:---:|:---:|
|《検索速度》:速い、《要素の追加/削除》:遅い|《検索速度》:遅い、《要素の追加/削除》:速い|

## HashSetクラス
- ArrayListクラス同様に複数のデータを扱う
- 値の重複を許さない(同じ値を追加しても無効)
- 値の順番を保持しない
    - n番目を取り出す、といったことはできない
- javaのutilパッケージからインポートして使う
- Setインターフェースを実装している
- ジェネリクス
- Setインターフェースで宣言することが多い

```java
import java.util.*;//utilパッケージからインポート

~中略~

Set<Integer> sales = new HashSet<>();

sales.add(10);
sales.add(20);
sales.add(30);
sales.add(30);//30は重複した値なので無効

for(Integer sale : sales){
  System.out.println(sale);//順不同で出力(ランダムというわけではなさそう)
}
```

同じくSetインターフェースを実装したものに、*TreeSet*,*LinkedHashSet*がある
|HashSet|TreeSet|LinkedHashSet|
|:---:|:---:|:---:|
|値が順不定|値順にソート|追加順を保持|

##HashMap
- 連想配列
- keyとvalueで値を管理
- utilパッケージからインポート
- 値の順番を保持しない
    - n番目を取り出す、といったことはできない
- javaのutilパッケージからインポートして使う
- Mapインターフェースを実装している
- ジェネリクス
    - 宣言時にkeyとvalueの型を指定する
- Mapインターフェースで宣言することが多い

|m.put(key,value)|m.remove(key)|m.size()|
|:--:|:--:|:--:|
|keyとvalueが対になった要素を追加|keyで指定した要素を削除|要素数を取得|

```java
import java.util.*;

~中略~

//インスタンス化
Map<String, Integer> sales = new HashMap<>();//ジェネリクス。keyとvalueの型を指定
sales.put("suzuki",100);//要素を追加
sales.put("satou",50);
sales.put("tanaka",70);

System.out.println(sales.get("tanaka"));//keyで値を呼ぶ
System.out.println(sales.size());//要素数

//要素を全て取り出す
for(Map.Entry<String, Integer> sale : sales.entrySet()){//saleにkeyとvalueを格納するループ?
  System.out.println(sale.getKey() + ":" + sale.getValue());//saleに格納されたkeyとvalueを表示
}
```

- Mapインターフェースを実装した**TreeMap**,**LinkedHashMap**がある

|HashMap|TreeMap|LinkedHashMap|
|:---:|:---:|:---:|
|順不定|key順|追加された順|


## 教科書
[ドットインストール](http://dotinstall.com/)さまさま

- [#38 Math､Randomクラスを使おう](http://dotinstall.com/lessons/basic_java_v2/37738)
- [#39 ArrayListを使ってみよう](http://dotinstall.com/lessons/basic_java_v2/37739)
- [#40 HashSetを使ってみよう](http://dotinstall.com/lessons/basic_java_v2/37740)
- [#41 HashMapを使ってみよう](http://dotinstall.com/lessons/basic_java_v2/37741)


## [@iwashi0830](https://twitter.com/iwashi0830)はこう思った
- 配列はあとから要素の追加、削除できないの！？
- クラスではなくインターフェースで変数を宣言することもできるのか
- 配列っぽく扱うListクラスやSetクラスがジェネリクスを使っていて、なるほど、と思った
- そろそろ序盤にやったことが頭から抜けてきている...
- HashSetクラスが要素に序列をつけていないのはあえてなのだろうか...