5月7日

授業の内容を記録するブログ
URL: http://2019se3.satoshis.jp/

テキストの14章から

リスト14-1

package ex;

public class Main {

	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		// ここで何らかの時間がかかる処理
		long end = System.currentTimeMillis();
		System.out.println("処理にかかった時間は…"
				+ (end - start) + "ミリ秒でした");
	}

}

前回の素数かどうかを判定するためのJUnitテスト PrimeTest.java

package ex;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class PrimeTest {

	@Test
	void 素数() {
		Prime p = new Prime();
		assertThat(p.isPrime(2), is(true));
		assertThat(p.isPrime(3), is(true));
		assertThat(p.isPrime(5), is(true));
		assertThat(p.isPrime(7), is(true));
		assertThat(p.isPrime(11), is(true));
		assertThat(p.isPrime(13), is(true));
		assertThat(p.isPrime(6700417), is(true));
		assertThat(p.isPrime(Integer.MAX_VALUE), is(true));
		//System.out.println(Integer.MAX_VALUE);
	}

	@Test
	void 素数ではない() {
		Prime p = new Prime();
		assertThat(p.isPrime(4), is(false));
		assertThat(p.isPrime(6), is(false));
		assertThat(p.isPrime(8), is(false));
		assertThat(p.isPrime(9), is(false));
	}
}

ターゲットプログラム Prime.java

package ex;

public class Prime {

	public boolean isPrime(int n) {
		if (n == 2) return true;
		if (n % 2 == 0) return false;
		for (int i = 3; i < n /2; i+=2) {
			if (n % i == 0) return false;
		}
		return true;
	}

}

この素数判定をリスト14-1の時間がかかる処理として追加する。

package ex;

public class Main {

	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		// ここで何らかの時間がかかる処理
		Prime p = new Prime();
		boolean b = p.isPrime(Integer.MAX_VALUE);
		System.out.println(Integer.MAX_VALUE
				+ "の素数判定結果は" + b + "です");
		long end = System.currentTimeMillis();
		System.out.println("処理にかかった時間は…"
				+ (end - start) + "ミリ秒でした");
	}

}

実行結果は以下の通り。

2147483647の素数判定結果はtrueです
処理にかかった時間は…1148ミリ秒でした

テキストのリスト14-2のコードを追加する。

package ex;

import java.util.Date;

public class Main {

	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		// ここで何らかの時間がかかる処理
		Prime p = new Prime();
		boolean b = p.isPrime(Integer.MAX_VALUE);
		System.out.println(Integer.MAX_VALUE
				+ "の素数判定結果は" + b + "です");
		long end = System.currentTimeMillis();
		System.out.println("処理にかかった時間は…"
				+ (end - start) + "ミリ秒でした");

		// リスト14-2
		Date now = new Date();
		System.out.println(now);
		System.out.println(now.getTime());
		Date past = new Date(1316622225935L);
		System.out.println(past);
	}

}

実行結果は以下の通り。

2147483647の素数判定結果はtrueです
処理にかかった時間は…1142ミリ秒でした
Tue May 07 10:34:32 JST 2019
1557192872306
Thu Sep 22 01:23:45 JST 2011

テキストのリスト14-3をCalMain.javaとして作成する。

package ex;

import java.util.Calendar;
import java.util.Date;

public class CalMain {

	public static void main(String[] args) {
		// 現在の年を表示する
		Date now = new Date();
		Calendar c = Calendar.getInstance();
		c.setTime(now);
		int y = c.get(Calendar.YEAR);
		System.out.println("今年は" + y + "年です");
		// 指定した日のDate型の値を得る
		c.set(2010, 8, 22, 1, 23, 45);
		Date past = c.getTime();
		System.out.println(past);
	}

}

SimpleDateFormat の使用例としてリスト14-4 のコードをCalMain.javaに追加する。

package ex;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class CalMain {

	public static void main(String[] args) throws Exception {
		// 現在の年を表示する
		Date now = new Date();
		Calendar c = Calendar.getInstance();
		c.setTime(now);
		int y = c.get(Calendar.YEAR);
		System.out.println("今年は" + y + "年です");
		// 指定した日のDate型の値を得る
		c.set(2010, 8, 22, 1, 23, 45);
		Date past = c.getTime();
		System.out.println(past);

		// リスト14-4 のコードを追加
		SimpleDateFormat f =
				new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		String s = f.format(now);
		System.out.println(s);
		// 指定日時の文字列を解析しDate型として得る
		Date d = f.parse("2011/09/22 01:23:45");
		System.out.println(d);
	}

}

リスト14-5 Empty.java

package ex;

public class Empty {

}

EmptyMain.java (テキストでは Main.java)

package ex;

public class EmptyMain {

	public static void main(String[] args) {
		Empty e = new Empty();
		String s = e.toString();
		System.out.println(s);
	}

}

実行結果は以下の通り。
@の手前はFQCNで@のあとはハッシュ値の16進数表記。

ex.Empty@70dea4e

toString() メソッドのカスタマイズ
Heroクラスを選択した状態で、メニューから[ソース]-[toString()生成]を選択する。
そのままOKすると、EclipseがtoString()メソッドを生成してくれる。
toString()で表示する必要がないフィールドがあれば、チェックを外してからOKする。

Hero.java

package ex;

public class Hero {
	String name;
	int hp;

	@Override
	public String toString() {
		return getClass().getName()
				+ "[name=" + name + ", hp=" + hp + "]";
	}
}

HeroMain.java

package ex;

public class HeroMain {

	public static void main(String[] args) {
		Hero h = new Hero();
		h.name = "ミナト";
		h.hp = 100;
		System.out.println(h.toString());
	}

}

Heroクラスを比較するために equals() メソッドを使ってみる。

package ex;

public class HeroMain {

	public static void main(String[] args) {
		Hero h = new Hero();
		h.name = "ミナト";
		h.hp = 100;
		System.out.println(h.toString());
		Hero h2 = new Hero();
		h2.name = "ミナト";
		h2.hp = 100;
		System.out.println(h.equals(h2));
	}

}

実行結果は以下の通り。

ex.Hero[name=ミナト, hp=100]
false

名前とhpが同じならtrueにしたい。

Eclipseに equals() メソッドを生成する機能があるので、それを使うと便利。
Heroクラスを選択した状態でメニューから[ソース]-[hashCode()およびequals()の生成]を選択する。
hpとnameフィールドにチェックが入っているのを確認してOKする。
すると、hashCode()とequals()メソッドが生成される。
HeroMainを実行すると、trueが出力されるのが確認できる。

package ex;

public class Hero {
	String name;
	int hp;

	@Override
	public String toString() {
		return getClass().getName()
				+ "[name=" + name + ", hp=" + hp + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + hp;
		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;
		Hero other = (Hero) obj;
		if (hp != other.hp)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}

HeroMainでh2の名前とHPを変更して、きちんと判定しているか確認する。

package ex;

public class HeroMain {

	public static void main(String[] args) {
		Hero h = new Hero();
		h.name = "ミナト";
		h.hp = 100;
		System.out.println(h.toString());
		Hero h2 = new Hero();
		h2.name = "ミナト";
		h2.hp = 100;
		System.out.println(h.equals(h2));
		h2.hp = 101;
		System.out.println(h.equals(h2));
		h2.hp = 100;
		System.out.println(h.equals(h2));
		h2.name = "ミナトA";
		System.out.println(h.equals(h2));
	}

}

実行結果は以下の通り。

ex.Hero[name=ミナト, hp=100]
true
false
true
false

コレクションフレームワーク
コレクションフレームワークは、複数のオブジェクトを扱う仕組みで、Javaではjava.utilパッケージにインタフェースやクラスが用意されている。

Listインタフェースの実装であるArrayListを使用した例。
add() : 要素を追加する。
remove() : 要素を削除する。
size() : 要素の数。
contains() : 要素が含まれているかどうかを調べる。

package ex;

import java.util.ArrayList;

public class ListMain {

	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<>();
		list.add("プレミアムモルツ");
		list.add("バドワイザー");
		list.add("ギネス");
		//System.out.println(list.get(1));
		list.add(0, "一番搾り");
		//System.out.println(list.get(1));
		// ループで要素を表示
		for (int i = 0; i < list.size(); i++) {
			System.out.println(i + ":" + list.get(i));
		}
		list.remove(0);
		for (String s : list) {
			System.out.println(s);
		}
		System.out.println(list.contains("一番搾り"));
		list.remove("ギネス");
		for (String s : list) {
			System.out.println(s);
		}
	}

}

Setインタフェースを実装したHashSetを使用した例。

package ex;

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

public class SetMain {

	public static void main(String[] args) {
		Set<String> set = new HashSet<>();
		set.add("マリオ");
		set.add("ルイージ");
		set.add("ピーチ");
		for (String s : set) {
			System.out.println(s);
		}
		set.add("マリオ");
		for (String s : set) {
			System.out.println(s);
		}
		System.out.println(set.contains("ピーチ"));
		set.remove("ピーチ");
		for (String s : set) {
			System.out.println(s);
		}
		System.out.println(set.contains("ピーチ"));
	}

}

実行結果は以下の通り。

マリオ
ピーチ
ルイージ
マリオ
ピーチ
ルイージ
true
マリオ
ルイージ
false

Mapインタフェースを実装したHashMapを使用した例。

package ex;

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

public class MapMain {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<>();
		map.put("m", "モンスターハンター");
		map.put("d", "ドラゴンクエスト");
		map.put("p", "ポケットモンスター");
		System.out.println(map.get("m"));
		Set<String> set = map.keySet();
		for (String key : set) {
			String v = map.get(key);
			System.out.println(key + ":" + v);
		}
		System.out.println(map.containsKey("a"));
		map.put("p", "パズルアンドドラゴンズ");
		for (String key : set) {
			String v = map.get(key);
			System.out.println(key + ":" + v);
		}
	}

}

実行結果は以下の通り。

モンスターハンター
p:ポケットモンスター
d:ドラゴンクエスト
m:モンスターハンター
false
p:パズルアンドドラゴンズ
d:ドラゴンクエスト
m:モンスターハンター

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください