CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

2016-01-01から1年間の記事一覧

第9章 Java 7 の機能を復習する : 問題 11 : ProcessBuilder

問題 ProcessBuilderクラスを使って、ユーザーのホームディレクトリの全てのサブディレクトリ内の全てのファイルからクレジット番号を探すために "grep -r" を呼び出すプログラムを作成せよ。 そして、ファイル内で見つけた番号を収集せよ。 解答 クレジット…

第9章 Java 7 の機能を復習する : 問題 10 : java.util.Objects クラス その 2

問題 次のLabeledPointクラスのcompareToメソッドを実装せよ。 public class LabeledPoint { private String label; private int x; private int y; ... } 解答 Java 8 で導入されたComparatorの default メソッドthenComparingを使えば一発なんだけど、ここ…

第9章 Java 7 の機能を復習する : 問題 9 : java.util.Objects クラス

問題 次のLabeledPointクラスのequalsメソッドとhashCodeメソッドを実装せよ。 public class LabeledPoint { private String label; private int x; private int y; ... } 解答 java.util.Objects クラスを使用する。 ■ equalsメソッド public boolean equal…

第9章 Java 7 の機能を復習する : 問題 8 : Integer.compare と Integer#compareTo

問題 整数の X 座標と Y 座標をフィールドに持つPointクラスのcompareToメソッドを、Integer#compareToを使わないで実装せよ。 public int compareTo(Point other) { int diff = Integer.valueOf(x).compareTo(other.x); if (diff != 0) return diff; return…

第9章 Java 7 の機能を復習する : 問題 7 : Files.copy の威力

問題 URL.openStreamとFiles.copyを使って、Web ページの内容を読み込んで、ファイルに保存するプログラムを作成せよ。 解答 私のはてなブログをファイルに書き出してみよう。 URL url = new URL("http://closedunbounded.hatenablog.com/"); try (InputStre…

第9章 Java 7 の機能を復習する : 問題 6 : Files.readAllLines の威力

問題 Files.readAllLinesとFiles.writeを使って、ファイルから全ての行を読み込み、逆順に書き出すプログラムを作成せよ。 解答 ファイルの文字コードは UTF-8 と仮定する。 List<String> lines = Files.readAllLines(Paths.get("/usr/share/dict/words")); Collecti</string>…

第9章 Java 7 の機能を復習する : 問題 5 : Files.readAllBytes の威力

問題 Files.readAllBytesとFiles.writeを使って、ファイルから全ての文字を読み込み、逆順に書き出すプログラムを作成せよ。 解答 ファイルの文字コードは UTF-8 と仮定する。 byte[] bytes = Files.readAllBytes(Paths.get("/usr/share/dict/words")); Stri…

第9章 Java 7 の機能を復習する : 問題 4 : 複数例外と共通のスーパークラス

問題 Java ライブラリを使用しているとき、複数例外をキャッチすることで恩恵を得られる状況に遭遇したライブラリは何か? 解答 JAXP ライブラリ(javax.xml のサブパッケージ)でありがたいと思った。 例えば、XML ファイルを読んで DOM オブジェクトを生成…

第9章 Java 7 の機能を復習する : 問題 3 : 複数例外のキャッチ

問題 複数の例外をキャッチするcatch節の中でその例外を再度スローする場合に、その処理が書かれているメソッドでのthrows宣言はどのように宣言すればよいか? 次の例で答えよ。 public void process() throws ??? { try { ... } catch (FileNotFoundExceptio…

第9章 Java 7 の機能を復習する : 問題 2 : 抑制された例外

問題 以下のコードを try-with-resources 文を使わず、かつcloseメソッドでスローされる例外を抑制された例外として元の例外に追加するように実装せよ。 ■ try-with-resources 文を使った例 try (BufferedReader in = Files.newBufferedReader(Paths.get("/u…

第9章 Java 7 の機能を復習する : 問題 1 : try-with-resources 文

問題 以下のコードを try-with-resources 文を使わないで実装せよ。 try (Scanner in = new Scanner(Paths.get("/usr/share/dict/words")); PrintWriter out = new PrintWriter("/tmp/out.txt") ) { while (in.hasNext()) out.println(in.next().toLowerCase…

第9章 Java 7 の機能を復習する

Java 7 の変更点は、Java 5, Java 8 に比べればそんなに大きくない(InvokeDynamic は大きな変更だけど、いかんせん地味だ)。 私的には、Java 7 の最大の変更点は try-with-resources 文である。 この章は、第8章の “その他の Java 8 機能” と同じぐらいの…

第8章 その他の Java 8 機能を理解する : 問題 16 : 正規表現の名前付きキャプチャグループ

問題 市(city)、州(state)、郵便番号(zip code)を含む行を解析するために、名前付きキャプチャグループを用いた正規表現を使用せよ。 郵便番号は、5桁と9桁(5桁ハイフン4桁)の両方を受け付けるようにせよ。 解答 本文には、市(city)と州(state)の2つをピッ…

第8章 その他の Java 8 機能を理解する : 問題 15 : 簡易 grep

問題 Files.linesとPattern#asPredicateを使用して、与えられた正規表現に一致するすべての行を表示する grep のようなプログラムを書け。 解答 機能をいろいろ盛り込みたいところだけど、ここは簡潔に以下のような仕様とする。 第1引数は正規表現の式、第2…

第8章 その他の Java 8 機能を理解する : 問題 14 : requireNonNull(T, Supplier<String>) メソッド

問題 java.util.ObjectsのrequireNonNull(T, Supplier<String>)メソッドは 第1引数がnullかどうかをチェックし nullのときは第2引数のラムダ式を評価して それをエラーメッセージとするNullPointerExceptionをスローする このメソッドによりもっと役立つエラーメッセ</string>…

第8章 その他の Java 8 機能を理解する : 問題 13 : ソースレベルのアノテーション処理

問題 問題 12 で定義したTestCaseアノテーションを処理するソースレベルのアノテーションプロセッサを構築せよ。 このプロセッサーは実行されると、テストを実行するmainメソッドを持つソースを出力する。 解答 問題 12 で定義したTestCaseアノテーションを…

第8章 その他の Java 8 機能を理解する : 問題 12 : 繰り返し指定できるアノテーション

問題 以下のようなプログラムを実装せよ。 TestCaseアノテーションを定義し そのアノテーションを持つクラスをロードして アノテーションが付いたメソッドを呼び出し メソッドが期待した値を返すかを検査する 引数と戻り値の型はintと想定する。 解答 JUnit …

第8章 その他の Java 8 機能を理解する : 問題 11 : Basic 認証

問題 パスワード保護(Basic 認証)された Web ページの内容を取得するプログラムを書け。 解答 ん~、一応コードは書くけど、Basic 認証しているサイトを知らないので、動作確認はなしね。 ■ Basic 認証 private InputStream basicAuthentication(URL url, …

第8章 その他の Java 8 機能を理解する : 問題 10 : Files.walk メソッド

問題 まず JDK の src.zip ファイルを解凍せよ。 Files.walkメソッドを使用して、予約語 transient volatile を含む Java のソースファイルを全て見つけよ。 解答 まず、ソースファイルにキーワードtransientまたはvolatileが含まれるかどうかをチェックする…

第8章 その他の Java 8 機能を理解する : 問題 9 : Scanner から Stream を生成

問題 Scannerを、単語, 行, 整数, または double のStreamに変換するメソッドを書け。 解答 以下の手順でStreamを生成する。 ScannerからIteratorを生成 IteratorからSpliteratorを得る SpliteratorからStreamを生成 まず、IteratorからStreamを生成するメソ…

第8章 その他の Java 8 機能を理解する : 問題 8 : Collections.CheckedQueue クラス

問題 CheckedQueueクラスの利点を示すプログラムを書け。 補足 CheckedQueueクラスは、公開されていない。 これはjava.util.CollectionsのネストクラスでCollectionsのcheckedQueueメソッドが返すクラスである。 解答 CheckedQueueクラスは、実行時に要素の…

第8章 その他の Java 8 機能を理解する : 問題 7 : Comparator の reversed メソッド

問題 Comparatorインターフェースのreservedメソッドを呼び出さないで nullsFirst(naturalOrder()).reserved() を表わせ。 解答 上の Comparator は null が先頭に来る昇順の逆順 である。 ■ Java の実際のコード Comparator<String> comp = Comparator.nullsFirst(C</string>…

第8章 その他の Java 8 機能を理解する : 問題 6 : Comparator の合成

問題 Comparatorインターフェースのメソッドだけを使ってjavafx.geometry.Point2Dの全順序(Total Ordering)な Comparator を定義せよ。 “全順序” とは、同値なオブジェクトに対してのみゼロを返す Comparator のことである。 解答 X座標の Comparator とY…

第8章 その他の Java 8 機能を理解する : 問題 5 : Stream vs Collection

問題 “第2章 ストリーム API の使い方” で、Listの中の長い単語を Stream を使って数えた。 List<String> words = ~; long count = words.stream() .filter(w -> w.length > 12) .count(); ラムダ式は用いるが Stream を使用しないで同じことを行え。 解答 java.uti</string>…

第8章 その他の Java 8 機能を理解する : 問題 4 : Random はゼロを生成するか?

問題? Math.nextDown(x)メソッドは、何らかのランダムな処理が x に正確に一致した場合に、x よりも次に小さな浮動小数点を返します。 これにより、返された数が x より小さいことが保証されます。 これは本当に保証できるのでしょうか? ちょっと待った! 上…

第8章 その他の Java 8 機能を理解する : 問題 3 : ユークリッドの互除法

問題 ユークリッドの互除法で、2つの整数の最大公約数を求めよ 2つ整数のどちらかが負でも、最大公約数は正の数になる(なぜなら反数も約数であり、正数の方が大きいからである) そして余りの計算に % Math.floorMode(int, int) 数学的な剰余計算(余りは常…

第8章 その他の Java 8 機能を理解する : 問題 2 : 厳密な算術演算

問題 Math.negateExact(int n)が例外をスローする整数 n の値は何か? 解答 これは一つしかない Integer.MIN_VALUE、即ち である private void exercise2() { int n = Integer.MIN_VALUE; // -2^31 n = Math.negateExact(n); } 実行すると java.lang.Arithmet…

第8章 その他の Java 8 機能を理解する : 問題 1 : unsigned int

問題 int と符号なし操作を使用して、 から までの間の加算、減算、除算、比較を行うプログラムを書け 解答 ■ 加算 足し算自体は、普通の + で可 int a = Integer.MAX_VALUE; // 2^31 - 1 int b = Integer.MAX_VALUE + 1; // 2^31 System.out.println(Intege…

第8章 その他の Java 8 機能を理解する

Java 8 の最も大きな変更点は何と言ってもラムダ式だが、その他の JavaFX とか java.time パッケージなどは第7章までで解説された。 この章では、比較的小さな Java 8 の新機能を網羅的に解説する。

CUB、Nashorn 問題やめるってよ

私は、第7章の JavaScript の練習問題をここで打ち切ります。 何でだろう? Java も JavaScript も好きなんだけど、どうも気乗りがしない。 Java から JavaScript のスクリプトを実行できるのは便利だけど、それだけ JavaScript 内で Java の API を呼び出す…