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


前回までのあらすじ

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

Mathクラス,Randomクラス

  • 数値を扱うクラス
  • よく使うメソッド

Mathクラス

Math.ceil() Math.floor() Math.round() Math.PI Math.random()
切り上げ 切り捨て 四捨五入 円周率 乱数(Randomクラスの方がよい)
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
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番目の項目削除する 要素の数を取得
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インターフェースで宣言することが多い
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で指定した要素を削除 要素数を取得
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順 追加された順

教科書

ドットインストールさまさま

@iwashi0830はこう思った

  • 配列はあとから要素の追加、削除できないの!?
  • クラスではなくインターフェースで変数を宣言することもできるのか
  • 配列っぽく扱うListクラスやSetクラスがジェネリクスを使っていて、なるほど、と思った
  • そろそろ序盤にやったことが頭から抜けてきている...
  • HashSetクラスが要素に序列をつけていないのはあえてなのだろうか...