Java

もっと Lambda その15

Java

今日のエントリーも Java8 ネタです。

このところ Java8 のエントリーがほとんどになってきたけど Lambda をはじめ、新機能がよく理解できてないので慣れることを目標としてます。(^_^;)

今回は無理矢理 Java8 を使って有名なナップサック問題を解くプログラムを創ってみました。

それでは下記のようなデータの人たちがいるとします。

<– Person  –>
柴田 恭平, 61歳, Gender: MALE   体重 : 70   評価 : 8
壇 蜜, 32歳, Gender: FEMALE   体重 : 60   評価 : 6
北川 景子, 26歳, Gender: FEMALE   体重 : 55   評価 : 7
綾瀬 はるか, 28歳, Gender: FEMALE   体重 : 50   評価 : 4
佐々木 希, 25歳, Gender: FEMALE   体重 : 48   評価 : 9
剛力 彩芽, 20歳, Gender: FEMALE   体重 : 45   評価 : 6
小栗 旬, 30歳, Gender: MALE   体重 : 65   評価 : 3
堀北 真希, 24歳, Gender: FEMALE   体重 : 45   評価 : 10
武井 咲, 19歳, Gender: FEMALE   体重 : 50   評価 : 5
市原 隼人, 26歳, Gender: MALE   体重 : 67   評価 : 2
深田 恭子, 30歳, Gender: FEMALE   体重 : 50   評価 : 8

あなたはヨットをもっていてクルージングを楽しもうとしています。

上記の人たちが「是非ご一緒させてください」と申し出てきました。

ヨットの制限であと 180 キログラムまでしか乗船できません。

そこであなたは、女性を同伴させることにします。

重量制限のあるなか、あなたは女性の評価値の総和が最大になるように同伴メンバーを選ばなくてはなりません。

今回はヨットであり、希望者も少ないのでわざわざプログラムを組む必要はないでしょう。

しかし、ある日突然大金持ちになって豪華客船でクルージングなんてことがあるかもしれません。(ヲヒ

プログラムの内容は 0-1 ナップサック問題 動的計画法アルゴリズムで良く知られているから解説はしません。

Java8 だとこんな風に組めるのかくらいに斜めにみてください。

実行結果は下記のようになります。

合計評価 : 27
佐々木 希    年齢 : 25    Gender : FEMALE   体重 : 48   評価 : 9
堀北 真希    年齢 : 24    Gender : FEMALE   体重 : 45   評価 : 10
深田 恭子    年齢 : 30    Gender : FEMALE   体重 : 50   評価 : 8

間違っているかもしれません。そのときは優しくご指摘くださいませ。

Java8 に詳しい方は「ここはこうすれば良いのにとかあればコソッとコメント入れといてくれると嬉しいです。」 なんてね。(^_^)

*注意* 2013年7月2日 API 使用変更に対応、ついでに選んだ人の情報取得方法を Optional と Person を使う二種類記述しました。

cludia_2013_06_08_001

Hatena タグ:

もっと Lambda 番外編

Java

この前のパズルの答えです。

Hatena タグ:

もっと Lambda その14

Java

今日も朝早くから「もっと Lambda」シリーズの始まりです。

Java Day Tokyo 2013 でテストパイロットを大募集していたらしいので UnaryOperator を試しがてらにちょっと確認を。

まず UnaryOperator の確認をします。

java.​util.​function

@FunctionalInterface
public interface UnaryOperator<T> extends Function<T,T>

An operation upon a single operand yielding a result. The operand and the result are of the same type. This is a specialization of Function for the case where the operand and result are of the same type.

パラメータ:

T – the type of operand to apply and of the result

日付:

1.8

参照:

Function

 

そして今回使う DoubleUnaryOperator は次のように double 専用に用意されたものです。

java.​util.​function

@FunctionalInterface
public interface DoubleUnaryOperator

An operation on a double operand yielding a double result. This is the primitive type specialization of UnaryOperator for double.

日付:

1.8

参照:

UnaryOperator

applyAsDouble(double operand) は次のようになってます。

java.​util.​function.​DoubleUnaryOperator

public double applyAsDouble(double operand)

Returns the double result of the operation upon the double operand.

パラメータ:

operand – the operand value

戻り値:

the operation result value

 

それでは無限小から 1 を引いた値の表示とその値と無限小が等しいか確認するプログラムを創ってみました。

ついでに無限小から無限小を引いてみました。(普通ありえない計算ですよね(^_^;)

実行結果は次のように期待通りになりました。

 

-Infinity
無限小
NaN
むりぽ

 

ここでバグがでたら片言の英語で「なんでやねん?」と言ってやろうと思ったがこんな単純なバグはそうそうあるもんじゃないですね。

Hatena タグ:

 


もっと Lambda その13

Java

今日のエントリーも「もっと Lambda」シリーズです。

今回はよく使われるデザインパターンで知られている Factory Method pattern を Java8 を使ってコーディングしてみます。

ちなみにこのネタは海外のサイトで紹介されていたものです。

それを少し変えて写経しただけですが随分シンプルになるので感激です。

それでは現在の Java だと下記のようになります。

Factory Method pattern でよく見かける典型的なサンプルですね。

インスタンスの生成をサブクラスに任せることによって柔軟に生成するインスタンスを選択することを可能としています。

では Java8 ではどのようなコードになるのでしょうか?

Java8 では抽象化クラス AirplanePilot とそれの具象化クラス二つが必要とされません。

その代わりに、Java8 の新機能の Default methods ( Virtual extension methods ) を実装したインターフェイスを利用します。

実行結果はどちらも次のようになります。

I pilot a new airplane.
ジェット機を操縦します。
ジェット機を整備します。
I pilot a new airplane.
戦闘機を操縦します。
戦闘機を整備します

実にシンプルで綺麗なコードで Factory Method pattern が実装できてしまうんですね!

Hatena タグ:

もっと Lambda その12

Java

昨日の Java パズラーの超ウルトラヒントを・・・

たぶん、必要ないと思うけど・・・

 

このパズルは古典的なオーバーフローをとりあげてます。

この新しい構文は、

と同じで、i += step のところでオーバーフローをおこします。

 

このループ文は一見すると Math.addExact() メソッドを利用しているので例外が出ると思ってしまいがちですが、

よ~~~く見ると引数の i++ でオーバーフローするので無限ループになってしまいます。

とても古典的で簡単なパズルでした。

これだけだと寂しいので Math.addExact() メソッドを覗いてみました。

なんか良く解らないけどビット演算を駆使して判定しているようですね。

なんで今頃こんなものを・・・以下自粛。(^_^;)

Hatena タグ:

« 古い記事 新しい記事 »