CUBは子供の白熊

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

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

第7章 Nashorn JavaScript エンジンの活用 : 問題 2 : jjs でラムダ式

問題 jjs を実行し、Stream ライブラリを使用して次の問題に対する解法をインタラクティブに求めよ あるファイルに含まれている長い単語(12文字より長い)を、重複なしで全てソートして表示せよ 解答 まず、Streamの要素をコンソールに表示して元のStreamを…

第7章 Nashorn JavaScript エンジンの活用 : 問題 1 : jjs で Java のクラスを試す

問題 例えばZonedDateTimeクラスなど、試してみたい Java API を選んで オブジェクトの生成 メソッドの呼び出し 戻り値の表示 など、jjs を使った実験を行え 解答 ■ オブジェクトの生成 ZonedDateTimeクラスにコンストラクタはないので、ファクトリメソッド…

第7章 Nashorn JavaScript エンジンの活用

Java 7 で、動的型付け言語を効率的に実行するために InvokeDynamic というバイトコードが新たに導入された 例えば、JavaScript で、次のような関数があった場合 function sum(a, b) { return a + b; } a + bの + 演算子は、文字列の連結なのだろうか? それ…

第6章 並行処理の機能強化 : 問題 11 : タスクを非同期に繰り返す

問題 次のメソッドを作成せよ public static <T> CompletableFuture<T> repeat(Supplier<T> action, Predicate<T> until) このメソッドはuntil関数が受け入れる値を生成するまでactionを非同期に繰り返す そして、until関数も非同期に実行する 解答 public static <T> Compl</t></t></t></t></t>…

第6章 並行処理の機能強化 : 問題 10 : CompletableFuture の合成

問題 ユーザーにURLを問い合わせて、そのURLのWebページを読み込み、全てのリンクを表示するプログラムを作成せよ 各ステップでCompletableFutureを使用せよ CompletableFutureのgetメソッドを呼び出さないこと 準備 各ステップの処理を(Futureを使わないで…

“第3章 問題 15 : 画像変換の並列化” リベンジ

エピソード IV - 新たなる希望 画像変換の遅延評価を並列化する第3章の問題15 で synchronizedを入れただけで、私のマシンでは20%遅くなった 私のマシンのコア数は4つなので、並列化しても挽回ならず結局遅くなってしまった(残念…) と書いたが、何も考えず…

第6章 並行処理の機能強化 : 問題 9 : フィボナッチ数の計算を並列化

問題 ひとつ前のブログを参照してくださいと言いたいとこだけど、一応書いときますか… フィボナッチ数の計算を並列化するためにArrays.parallelPrefixメソッドを使え n 番目のフィボナッチ数は F = | 1 1 | | 1 0 | とした場合の F の n 乗の計算結果の左上…

第6章 並行処理の機能強化 : 問題 9 : フィボナッチ数の計算を並列化

問題 フィボナッチ数の計算を並列化するためにArrays.parallelPrefixメソッドを使え n 番目のフィボナッチ数は とした場合の の計算結果の の値である 注意 Markdown 記法のバグなのか、この後に Java のコードを書くと、せっかく TeX を使って書いた行列式…

第6章 並行処理の機能強化 : 問題 8 : parallelSort と sort

問題 あなたのコンピュータではArrays.parallelSortは、配列のサイズがどのくらいになればArrays.sortより速くなるか? 解答 Arrays.parallelSortはサイズが 8K 以下のときはマルチで動作しない そこで 8K から始めて 1K づつサイズを増やして計測してみる ■ …

第6章 並行処理の機能強化 : 問題 7 : ConcurrentHashMap の reduce メソッド

問題 ConcurrentHashMap<String, Long>内で、最大値を持つキーを見つけよ 同じ Long 値であれば、どのキーであっても構わない 準備 戦争と平和の単語(57万5343語)の出現回数のマップを使う ただし、3文字以下の単語は切り捨てる(でないと the が圧倒的だもんね) ■ 単語</string,>…

第6章 並行処理の機能強化 : 問題 6 : ConcurrentHashMap の computeIfAbsent メソッド

問題 複数スレッドが複数のファイルから全ての単語を読み込むアプリケーションを書け 各々の単語がどのファイルで使用されていたかを管理するためにConcurrentHashMap<String,Set<File>>とcomputeIfAbsentメソッドを使用せよ 準備 読み込むテキストファイルは問題 5 と同じ5つ</string,set<file>…

第6章 並行処理の機能強化 : 問題 5 : ConcurrentHashMap の merge メソッド

問題 複数スレッドが複数のファイルから全ての単語を読み込むアプリケーションを書け 各々の単語がどのファイルで使用されていたかを管理するためにConcurrentHashMap<String,Set<File>>とmergeメソッドを使用せよ 準備 テキストファイルから単語を順次読み込む Reader を定義</string,set<file>…

第6章 並行処理の機能強化 : 問題 4 : LongAccumulator

問題 LongAccumulatorを使用して、要素の最大値あるいは最小値を計算せよ 解答 1000万個の配列を用意して、最大値を求めてみる ■ 準備 long[] values = new long[1000_0000]; for (int i = 0; i < values.length; i++) { values[i] = (long)(1000_0000 * Mat…

第6章 並行処理の機能強化 : 問題 3 : AtomicLong と LongAdder

問題 1,000個のスレッドを生成し、各スレッドは、ある一つのカウンターを100,000回インクリメントする AtomicLong と LongAdder を使用した場合の性能を比較せよ 解答 ■ AtomicLong final int TASK = 1000; final int COUNT = 100_000; AtomicLong globalCou…

第6章 並行処理の機能強化 : 問題 2 : LongAdder

問題 増加する ID 列を生成するためにLongAdderは役に立つか? その答えの理由を述べよ 解答 LongAdderは、正しい値を取得できないので役に立たない まずLongAdderのincrementメソッドは、現在の値を返さない ■ 計算系のメソッド void increment() void add(l…

第6章 並行処理の機能強化 : 問題 1 : AtomicReference

問題 多数のスレッドが更新する最大長の文字列を管理するプログラムを書け 解答 単語の一覧は、第2章で出てきた戦争と平和(war-and-peace.txt)を使う ■ 単語一覧の取得 … 単語数 = 575,343 String[] words; String contents = new String( Files.readAllBy…

第6章 並行処理の機能強化

Java が登場した当時は ロックで同期をとる機能が、ライブラリではなく言語レベルでサポートされている ことが画期的だった プログラマはsynchronizedを拍手でもって迎えたが、それによって並行プログラミングの難しさが軽減された訳ではなかった ただ、Java…

第5章 日付と時刻の新たな API : 問題 12 : 約束の通知

問題 異なるタイムゾーンにある約束を読み込んで、ローカル時刻で1時間前に約束があることをユーザーに通知せよ 例えば、ニューヨークで午前10時に電話会議があったときも、今いる東京で正しいローカル時間に通知を受けることができる 解答 約束とは、タイト…

第5章 日付と時刻の新たな API : 問題 11 : 飛行時間

問題 帰りの便は、フランクフルトを14時5分に出発し、ロサンジェルスに16時40分に到着する 飛行時間は何時間何分か? 個別に計算するのではなく、このような時刻計算を処理できるプログラムを書け 解答 問題10で定義したFlightクラスにメソッドを追加しよう ■…

第5章 日付と時刻の新たな API : 問題 10 : 飛行機の到着時間

問題 ロサンジェルスからフランクフルト行きの便は、ローカル時刻の3時50分に出発し、10時間50分のフライトである 何時に到着するか? 個別に計算するのではなく、このような時刻計算を処理できるプログラムを書け 解答 ただメソッドを書いてもつまらないので…

第5章 日付と時刻の新たな API : 問題 9 : 分の端数がある時差

問題 全てのタイムゾーンおいて、UTC との時差に1時間未満の情報が含まれる全てのタイムゾーンを見つけよ 解答 “1時間未満の情報が含まれる” とは、「時差が1時間より小さい」ということではなく、「時差に分の端数が出る」という意味だと解釈した では、時…

第5章 日付と時刻の新たな API : 問題 8 : タイムゾーンと時差

問題 現在の時刻インスタンスに対してサポートされる全てのタイムゾーンおいて、今日の日付のオフセット(UTC との差)を取得せよ 解答 UTC との時差は、以下の流れで算出する ゾーンID(ZoneId) ↓ そのゾーンIDの日付時間(ZonedDateTime) ↓ UTC の日付時…

第5章 日付と時刻の新たな API : 問題 7 : イベント

問題 カレンダーのイベント(例えば、指定された日付の午前10時から午後11時まで)に適した、時刻のインターバルを表す TimeInterval クラスを実装せよ あと、二つのインターバルが重なっているかどうかを検査するメソッド提供せよ 解答 “指定された日付の” …

第5章 日付と時刻の新たな API : 問題 6 : 13日の金曜日

問題 20世紀の全ての13日の金曜日を列挙せよ 解答 この章の練習問題は、練習問題らしい難易度ですね サクサク行きましょう YearMonth month = YearMonth.of(1901, Month.JANUARY); YearMonth lastMonth = YearMonth.of(2000, Month.DECEMBER); while (month.…

第5章 日付と時刻の新たな API : 問題 5 : 日数計算

問題 今までにあなたが生きてきた日数を表示するプログラムを書け 解答 私の年齢はご勘弁を... 代わりに、Java 生誕20周年を祝して、Java が生きてきた日数を表示します 試しに和暦を使ってみます JapaneseDate birthday = JapaneseDate.of(JapaneseEra.HEIS…

第5章 日付と時刻の新たな API : Temporal って何?

時間(時間の経過ではない)を意味する英語はたくさんある 一般的な Time の他に Instant Temporal Chrono Date Era 時間の経過を意味する英語は Duration Period など java.timeパッケージのインターフェース, クラスには、これらが全て現れる ん~、便利な…

第5章 日付と時刻の新たな API : 問題 4 : カレンダー

問題 指定された月のカレンダーを表示するプログラムを書け 例えば java Cal 3 2013 を実行すると、次のように表示する 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 週は、月曜日から始まるものとする 解答 コマ…

第5章 日付と時刻の新たな API : 問題 3 : TemporalAdjuster

問題 Predicate<LocalDate>を受け取りTemporalAdjusterを返すnextメソッドを実装せよ 戻り値のTemporalAdjusterは、翌日以降でPredicateを満たす日付を生成する 例えば today.with(next(w -> w.getDayOfWeek().getValue() < 6)) は、今日より後の最初の平日の日付を返す</localdate>…

日付と時刻の新たな API : 問題 2 : 日付の加算

問題 LocalDate.of(2000, 2, 29)に1年を加算するとどうなるか? 解答 JavaDoc に 無効なときは「月の日」を最後の有効な日に調整します とあるので、2001年2月28日になる LocalDate date = LocalDate.of(2000, 2, 29); date = date.plusYears(1); // 2001/2/2…

第5章 日付と時刻の新たな API : 問題 1 : プログラマーの日

問題 plusDaysメソッドを使用しないで、プログラマーの日を計算せよ ちなみに、プログラマーの日は、元旦から256日目にあたる日のことで、ロシアでは公式の祝日になっている 解答 今年のプログラマーの日を計算するメソッドを実装する ■ 今年が何年かを調べ…