授業の内容を記録するブログ
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:モンスターハンター