5月11日

コレクションフレームワーク

Set

Setは重複のないコレクション。すでに存在するものをadd()した場合は、falseが返される。

SetSample.java

import java.util.HashSet;
import java.util.Set;

public class SetSample {
	public static void main(String[] args) {
		Set<String> set = new HashSet<String>();
		set.add("東京");
		set.add("ロンドン");
		set.add("パリ");
		for (String item : set) {
			System.out.println(item);
		}
	}
}

SetSample2は、SetインタフェースをCollectionインタフェースに置き換えただけ。
JavaDocでCollectionインタフェースを確認すると、ListやSetで使用したメソッドが定義されていることがわかる。

Eclipseの機能を使用してSetSample3.javaを作成する。

  1. SetSample.javaの上で右クリックしコピーを選択
  2. デフォルトパッケージの上で右クリックし貼り付けを選択
  3. クラス名が CopyOfSetSample になっているので、これを SetSample3 に修正してOKする
  4. これでSetSampleの内容がSetSample3.javaにコピーされる

SetSample.javaと異なる部分を入力してSetSample3.javaを作成する。

import java.util.HashSet;
import java.util.Set;

public class SetSample3 {

	public static void main(String[] args) {
		Set<String> set = new HashSet<String>();
		set.add("東京");
		set.add("ロンドン");
		set.add("パリ");

		if (!set.add("ロンドン")) {
			System.out.println("ロンドンは追加できない");
		}
		if (set.contains("ロンドン")) {
			System.out.println("ロンドンはある");
		}
		for (String item : set) {
			System.out.println(item);
		}
	}
}

テキストにはない例題をやってみる。

  1. ListSample6.javaのmainメソッド内をコピーする
  2. SetSample6.javaのmainメソッドに貼り付ける
  3. ListをSetに変更する
  4. ArrayListをHashMapに変更する
  5. 変数listにカーソルを置きメニューのリファクタリングを選択
  6. 変数名listをset変更すると、すべてのlistがsetに変更される(便利!)

SetSample4.java

import java.util.HashSet;
import java.util.Set;

public class SetSample4 {
	public static void main(String[] args) {
		Set<Man> set = new HashSet<Man>();
		set.add(new Man("孫", 10));
		set.add(new Man("北尾", 15));
		set.add(new Man("三木谷", 20));
		if (!set.add(new Man("孫", 10))) {
			System.out.println("孫は追加できない");
		}
		for (Man man : set) {
			System.out.println(man);
		}
	}
}

これを実行すると、二人目の孫が追加できてしまう。
二人目の孫を追加できないようにコードを修正する。

Man.javaを修正する。

  1. Man.javaを開く
  2. メニューの ソース を選択する
  3. hashCode()およびequeals()の生成 を選択する
  4. ageとnameにチェックが入った状態でOKする

これで、Man.java にhashCode()とequals()のオーバーライドが生成される。

Man.java

public class Man {
	String name;
	int age;
	Man(String name, int age) {
		this.name = name;
		this.age = age;
	}
	void introduce() {
		System.out.println("僕は" + name + " 年は" + age);
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Man other = (Man) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return super.toString() + "[name=" + name + ", age=" + age + "]";
	}
}

SetSample4.java を実行すると「孫は追加できない」と表示されるようになる。

Mapの利用

Mapはキーに対応した値を持つ集合。

MapSample.java

import java.util.HashMap;
import java.util.Map;

public class MapSample {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("red", "赤");
		map.put("blue", "青");
		map.put("yellow", "黄色");
		String value = map.get("blue");
		System.out.println(value);
	}
}

要素を一覧する

MapSample2を作るまでもないので、MapSample.javaを修正して試す。

import java.util.HashMap;
import java.util.Map;

public class MapSample {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("red", "赤");
		map.put("blue", "青");
		map.put("yellow", "黄色");
		//String value = map.get("blue");
		//System.out.println(value);
		for (String key : map.keySet()) {
			String value = map.get(key);
			System.out.println(key + "=" + value);
		}
	}
}

Iteratorを使った走査

Iteratorインタフェースを使って要素の走査をすることもできる。

IteratorSample.java

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorSample {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("東京");
		list.add("ロンドン");
		list.add("パリ");
		Iterator<String> iter = list.iterator();
		while (iter.hasNext()) {
			String item = iter.next();
			System.out.println(item);
		}
	}
}

配列とListの変換

配列からListへの変換はArraysクラスのstaticメソッドasList()を使用する。
Listから配列への変換はListインタフェースのtoArray()メソッドを使用する。

ArraySample.java

import java.util.Arrays;
import java.util.List;

public class ArraySample {
	public static void main(String[] args) {
		String[] array = new String[] {"東京", "ロンドン", "パリ"};
		// 配列→リスト
		List<String> list = Arrays.asList(array);
		System.out.println("list");
		for (String s : list) {
			System.out.println(s);
		}
		// List→配列
		String[] array2 = list.toArray(new String[0]);
		System.out.println("array");
		for (String s : array2) {
			System.out.println(s);
		}
	}
}

ソートとComparator

Collectionsクラスのsort()メソッドを使って文字列をソートする例。

SortSample.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SortSample {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("いいい");
		list.add("ううう");
		list.add("あああ");
		Collections.sort(list);
		for (int i = 0; i < list.size(); i++) {
			String item = list.get(i);
			System.out.println(i + ":" + item);
		}
	}
}

ソート順序をカスタマイズする

ソート順序をカスタマイズするには java.util.Comparator インタフェースを実装したクラスを作成し、sort()メソッドの第2引数に渡す。

SortSample2.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortSample2 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("いい");
		list.add("う");
		list.add("あああ");
		class MyComparator implements Comparator<String> {
			@Override
			public int compare(String o1, String o2) {
				return o1.length() - o2.length();
			}
		}
		Collections.sort(list, new MyComparator());
		for (int i = 0; i < list.size(); i++) {
			String item = list.get(i);
			System.out.println(i + ":" + item);
		}
	}
}

無名クラスを使ったコードを追加する。

24行目で新しい要素を追加。
25~30行は、Collections.sort()メソッドの呼び出しで無名クラスのComparatorを第2引数に渡した例。
31~34行で結果の出力。

SortSample2.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortSample2 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("いい");
		list.add("う");
		list.add("あああ");
		class MyComparator implements Comparator<String> {
			@Override
			public int compare(String o1, String o2) {
				return o1.length() - o2.length();
			}
		}
		Collections.sort(list, new MyComparator());
		for (int i = 0; i < list.size(); i++) {
			String item = list.get(i);
			System.out.println(i + ":" + item);
		}

		list.add("ええ");
		Collections.sort(list, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return o1.length() - o2.length();
			}
		});
		for (int i = 0; i < list.size(); i++) {
			String item = list.get(i);
			System.out.println(i + ":" + item);
		}
	}
}

引数が1個のsort()メソッドに渡すListは、Comparableインタフェースを実装しているクラスを格納しておかなければいけない。
Comparableインタフェースを実装していないManを格納したListを渡すコードを書いてみる。

SortSample2.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;


public class SortSample2 {

	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("いい");
		list.add("う");
		list.add("あああ");
		class MyComparator implements Comparator<String> {
			@Override
			public int compare(String o1, String o2) {
				return o1.length() - o2.length();
			}
		}
		Collections.sort(list, new MyComparator());
		for (int i = 0; i < list.size(); i++) {
			String item = list.get(i);
			System.out.println(i + ":" + item);
		}

		list.add("ええ");
		Collections.sort(list, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return o1.length() - o2.length();
			}
		});
		for (int i = 0; i < list.size(); i++) {
			String item = list.get(i);
			System.out.println(i + ":" + item);
		}

		List<Man> list2 = new ArrayList<Man>();
		Collections.sort(list2);
	}
}

Collections.sort(list2);の部分でコンパイルエラーになる。
Manクラスをimplements Comparable し、compareTo()メソッドを追加するとエラーが解消する。

Man.java


public class Man implements Comparable<Man>{
	String name;
	int age;
	Man(String name, int age) {
		this.name = name;
		this.age = age;
	}
	void introduce() {
		System.out.println("僕は" + name + " 年は" + age);
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Man other = (Man) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return super.toString() + "[name=" + name + ", age=" + age + "]";
	}
	@Override
	public int compareTo(Man o) {
		return 0;
	}
}

5月8日

WordPressのURL: http://abc2015.satoshis.jp/

Eclipseに慣れる

テキストp.406 まとめ

Eclipseでプログラミングするときの手順。

プロジェクトを作る

  1. [新規]-[Javaプロジェクト]
  2. プロジェクト名を入力
  3. 「完了」

クラスを作る

  1. [新規]-[クラス]
  2. パッケージ名を指定(プロジェクト名が入っているので消す)
  3. クラス名を入力
  4. 完了をクリック

21章 例外とアサーション

まとめの練習問題
Renshu.java

import java.io.IOException;

public class Renshu {

	public static void main(String[] args) throws IOException {
		foo(10);
		bar(20);
	}

	static void foo(int a) throws IllegalArgumentException {
		//
	}

	static void bar(int b) throws IOException {
		//
	}
}

Renshu2.java

class FooException extends Exception {

}

public class Renshu2 {

	public static void main(String[] args) {
		try {
			foo();
		} catch (FooException e) {
			System.out.println(e);
		}
	}

	private static void foo() throws FooException {
		throw new FooException();
	}

}

22章 クラスを使いこなす

ネストクラス

ネストクラスには、以下の3種類がある。

  • メンバクラス
  • ローカルクラス
  • 無名クラス

ガベージコレクション

ガベージコレクションは、不要になったインスタンスが使用したメモリ領域を自動的に解放する仕組み。

列挙型

列挙型は定数の集合を扱うための型。

BloodType.java


public enum BloodType {
	A,
	B,
	AB,
	O
}

EnumSample.java

public class EnumSample {

	public static void main(String[] args) {
		BloodType bloodType = BloodType.A;
		System.out.println("bloodType=" + bloodType);
	}

}

EnumSample2.java


public class EnumSample2 {

	public static void main(String[] args) {
		BloodType type = BloodType.valueOf("B");
		System.out.println(type.name());
		System.out.println(type == BloodType.A);
		System.out.println(type == BloodType.B);
		BloodType[] values = BloodType.values();
		for (BloodType value : values) {
			System.out.print(value + ",");
		}
	}

}

static import

static import することで、他のクラスのstaticメンバに直接アクセスできるようになる。

StaticImportSample.java

import static java.lang.Math.*;

public class StaticImportSample {

	public static void main(String[] args) {
		double pi = PI;
		System.out.println(pi);
		int num = abs(-10);
		System.out.println(num);
	}

}

23章 コレクション

コレクションでは、主に3つの種類がよく使われる。

  • List
  • Set
  • Map

ListSample.java(警告が表示されるが、ここでは無視)

import java.util.ArrayList;

public class ListSample {

	public static void main(String[] args) {
		ArrayList list = new ArrayList();
		list.add("東京");
		list.add("ロンドン");
		list.add("パリ");
		list.add(new Integer(1));
		for (int i = 0; i < list.size(); i++) {
			String item = (String)list.get(i);
			System.out.println(i + ":" + item);
		}
	}

}

ジェネリックス

ジェネリックスを使って型引数を指定する。
コレクションフレームワークでは、標準ではObject型を扱うが、ジェネリックスによって特定の型のみを扱えるように制限する。

ListSample3.java

import java.util.ArrayList;
import java.util.List;


public class ListSample3 {

	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("東京");
		list.add("ロンドン");
		list.add("パリ");
		for (int i = 0; i < list.size(); i++) {
			String item = list.get(i);
			System.out.println(i + ":" + item);
		}
	}

}

自作クラスの利用

コレクションフレームワークでは、自作クラスも利用できる。

Man.java


public class Man {
	String name;
	int age;
	Man(String name, int age) {
		this.name = name;
		this.age = age;
	}
	void introduce() {
		System.out.println("僕は" + name + " 年は" + age);
	}
}

ListSample5.java

import java.util.ArrayList;
import java.util.List;


public class ListSample5 {

	public static void main(String[] args) {
		List<Man> list = new ArrayList<Man>();
		list.add(new Man("孫", 10));
		list.add(new Man("北尾", 15));
		list.add(new Man("三木谷", 20));
		for (int i = 0; i < list.size(); i++) {
			Man man = list.get(i);
			man.introduce();
		}
	}

}

拡張for文で走査する

ListSample6.java

import java.util.ArrayList;
import java.util.List;

public class ListSample6 {

	public static void main(String[] args) {
		List<Man> list = new ArrayList<Man>();
		list.add(new Man("孫", 10));
		list.add(new Man("北尾", 15));
		list.add(new Man("三木谷", 20));
		for (Man man : list) {
			System.out.println(man);
		}
	}

}

このままでは出力結果がよくわからないので、ManクラスでtoString()メソッドをオーバーライドする。

Man.java


public class Man {
	String name;
	int age;
	Man(String name, int age) {
		this.name = name;
		this.age = age;
	}
	void introduce() {
		System.out.println("僕は" + name + " 年は" + age);
	}

	@Override
	public String toString() {
		return super.toString() + "[name=" + name + ", age=" + age + "]";
	}
}

5月1日

Webアプリ開発

自己紹介

「さわださとし」で検索してみてください。

ロードマップ

こちらにあります。

テキスト

Amazon.co.jp: 基礎からのJava 改訂版 (基礎からのシリーズ): 宮本 信二: 本

 PART01 はじめてのJava 
 CHAPTER01 Javaって何 
 CHAPTER02 はじめてのJava 

 PART02 Java文法の基礎 
 CHAPTER03 変数 
 CHAPTER04 数字の計算 
 CHAPTER05 プログラムに引数を渡す 
 CHAPTER06 いろいろなデータ型 
 CHAPTER07 フロー制御1 条件分岐 
 CHAPTER08 フロー制御2 繰り返し制御 
 CHAPTER09 配列 
 CHAPTER10 メソッドの基本 

 PART03 クラスの基本 
 CHAPTER11 はじめてのクラス 
 CHAPTER12 もう少しクラス 
 CHAPTER13 アクセス修飾子 
 CHAPTER14 標準ライブラリとAPIリファレンス 
 CHAPTER15 文字列を扱う 
 CHAPTER16 はじめての例外 
 CHAPTER17 コンソール入出力 
 CHAPTER18 パッケージとクラスパス 

 PART04 クラスとオブジェクト 
 CHAPTER19 継承 
 CHAPTER20 ポリモーフィズム 
 CHAPTER21 例外とアサーション 
 CHAPTER22 クラスを使いこなす 

 PART05 Javaを便利に使う 
 CHAPTER23 コレクション 
 CHAPTER24 ストリームを使いこなす 
 CHAPTER25 スレッド 

 APPENDIX 
 APPENDIX01 Javaの演算子 
 APPENDIX02 Javaのキーワード 
 APPENDIX03 例外一覧

Eclipseに慣れる

Eclipseとは、ソフトウェアを開発するための開発ツール。
MicrosoftではVisual Studioに相当するもの。
IBMが開発し、現在はオープンソースで開発が続けられている。

基本的な使い方

Eclipseでは、プログラムを「プロジェクト」単位で管理する。

便利なキー操作

  • Ctrl+A: 全選択
  • Ctrl+I: インデント修正
  • Ctrl+SPACE: 補完リストをポップアップ
  • Ctrl+S: 保存

さっそく使ってみよう!

Javaの基本的なプログラムを作って動かしてみる。

ポリモーフィズムの復習

Rect.java


public class Rect implements Shape {

	double width;
	double height;

	Rect(double width, double height) {
		this.width = width;
		this.height = height;
	}

	@Override
	public double getArea() {
		return width * height;
	}

	@Override
	public String toString() {
		return super.toString() + "[width=" + width + ", height=" + height + "]";
	}

}

Circle.java


public class Circle implements Shape {

	double radius;

	Circle(double radius) {
		this.radius = radius;
	}

	@Override
	public double getArea() {
		return radius * radius * Math.PI;
	}

	@Override
	public String toString() {
		return super.toString() + "[radius=" + radius + "]";
	}

}

IfSample2.java


public class IfSample2 {

	public static void main(String[] args) {
		Shape s1 = new Rect(10.0, 5.0);
		System.out.println(s1.getArea());
		System.out.println(s1);
		Shape s2 = new Circle(3.0);
		System.out.println(s2.getArea());
		System.out.println(s2);
	}

}