Java

NetBeans 8 開発版で JDK 8 EA を使ってみた

Java NetBeans

まだまだ遠いけど、手が届きそうなところまで近づいてきた JDK 8 を試してみます。

統合開発環境を使って動かせるようにも成りつつあるようです。

IntelliJ12でJDK8のlambda

Eclipse で Java8!

そこで我らがヒーロー NetBeans はどういった状況なのか? さっそく試してみました。

次期リリース予定の開発版をダウンロードしてインストールしてみました。

JDK 8 は Java™ Platform, Standard Edition 8 Early Access with Lambda Support と

JDK™ 8 Early Access Releases があります。

後者は前者の成果物を一部マージしたものとなっているようです。(たぶん・・・)

現在は Build b79 となっています。

Java™ Platform, Standard Edition 8 Early Access with Lambda Support を使って NetBeans をインストールしたのですが、

ちょっと問題が発生したので JDK™ 8 Early Access Releases に切り替えました。

JDK の変更は設定ファイルをちょこっと書き換えるだけで簡単にできるので気にしなくていいですね。

1

それでは The Java Tutorials を試してみましょう。

jp\yucchi\Member.java

jp\yucchi\RosterTest.java

コメントアウトしてあるところがあるのですが Mapper インターフェースが無いよって言われます。

JDK を変更しても一緒だったので何か変更されたのか、変更中なのかもしれません。

とりあえずここまではチュートリアル通りに動くようです。

一部コードは変更してあります。

さぁ、それでは、NetBeans の Lambda Expression 対応状況をみてみましょう。

このような匿名クラスを使ってるのをみつけると

2

このように Lambda Expression に変更できますよって親切に教えてくれます。

3

Lambda 使っちゃいますよってポチッってすると

4

これからの Java に変更されます。

5

チュートリアルで Lambda Expression を使う場合のコードと同じですね。(^-^)

6

おまけとして、Java™ Platform, Standard Edition 8 Early Access with Lambda Support を使った場合は

このように Functional Operation をお勧めしてくれます。

なんて親切なんだろう。

7

で、お勧めに従って Use Functional Operation をポチッとクリックすると

8

素敵ですね。拡張 for 文から見慣れない forEach 文を使った構文に変更されてます。

9

filter() を使えばいろいろ便利に使えそうな予感がします。

チュートリアルの充実と JDK 8 及び NetBeans の熟成が楽しみです。(*^O^*)

Hatena タグ: ,

実行可能JARファイルが Java 7 u11 で動くようになっていた

Java

実行可能JARファイルが Java 7 になってから動かなくなってがっかりしていたが Windows 8 Pro , Java 7 u11 で動くことを確認!

いつから動くようになったのかは不明です。

また、Windows 7 での確認はまだしていません。

これで過去に作った自分専用の Java アプリが使えます。(^^)

そう言えばこの件をネットで調べていたとき同じように Java 7 で動かなくなって弱ってる人を発見しました。

早速教えてあげようと思ったがどこのサイトだったか記憶にない(^^;

Hatena タグ:

Nクイーン問題 nQueens Problem

Java

Java で Nクイーン問題  nQueens Problem をプログラミングしてみました。

まず Nクイーン問題とは何か?

ネットでググってみると8クイーン問題ってのがよくとりあげられてます。

Nクイーン問題とはそれを一般化したようです。

では8クイーン問題から調べていきましょう。

8クイーン問題では、王妃(クイーン)8個が用意されています。

チェス盤のサイズは王妃(クイーン)と同じ数とします。

8クイーンでは縦、横8マスです。

そのチェス盤に全ての王妃(クイーン)を配置します。

ただし、それぞれの王妃(クイーン)の利き筋には配置できません。(縦、横、斜めの4ライン)

bord_n

以上の条件を全て満たす王妃(クイーン)の配置パターン及び総数を求めるものです。

それではどうやって解を導き出したらいいのか考えてみることにします。

8個の王妃(クイーン)を全ての組み合わせに配置して上記の条件をクリアするかを確認すればいいだけのことですね。

しかし、その方法だと 8 X 8 = 64 マスあるから

64 X 63 X 62 X 61 X 60 X 59 X 58 X 57 = 178,462,987,637,760 通りもあることになります。

ちょっと多いですね。

王妃(クイーン)の数が大きくなった時のことを考えたら厳しいです。

しかし、全ての組み合わせを調べる必要はなさそうです。

何故なら、同じ列、行に王妃は配置できないからです。

縦、横の利き筋の条件を考慮した結果、各列、行には王妃(クイーン)は 1 個だけしか配置できない!

よって、 8! = 40,320 通りまで激減させることができる。

あと斜めの利き筋2つを利用すれば計算処理はもっと少なくなるだろう。

bord_d_pos 

bord_d_neg

以上のことを考慮した上で次のようなプログラムを作ればいいかもしれない。

private static void trySet(int i) {

     for (王妃の数だけループ) {

         if (利き筋から外れていれば) {

              王妃 i 列 j 行に配置

            if (i == (王妃8個配置できたら) {

                 トータルパターン数をカウントアップ

                 盤面を表示

            }else {

                    王妃の利き筋(行、斜め)をセット

                    次の列を配置(再帰 trySet(i + 1))

                    王妃の利き筋(行、斜め)を解除

                    }
             }
     }
}

 

ってことで作ってみました。

ただ、デバッガでプログラムの流れを追うために王妃(クイーン)の数は 4 としました。

もちろん、王妃(クイーン)の数は一般化できるようにしてあります。

 

nqueensproblem.NQueensProblem.java

 

さて、理屈やコードだけでは解りにくいかもしれないのでこのプログラムの流れをデバッグ実行して確認してみます。

デバッグウィンドウやウォッチポイントの変数の値を確認しながらごらんくださいませ。

 

 

n1

プログラムの流れを見ていると人間の思考原理に非常に良く似ていますね。

とりあえず順番に試してみる。

条件を考慮して無駄なことはせず作業量を減らす。

途中で駄目だと判断できたら戻って次のパターンからやり直す。

それの繰り返しで処理を完了する。

こういったアルゴリズムはバックトラック法って言われているようです。

深さ優先探索アルゴリズムですね。

試行錯誤的に解を探し出すタイプの問題に有効です。

つまり、基本的に全ての選択肢を試してみるしか無い場合なんかには有効のようです。

いつ頃、誰が、どのような理由でこういったアルゴリズムを考えたのか?

考えた人を心から尊敬します。

ちなみに 8王妃問題としてプログラムを実行したい場合は上記プログラムの 9 行目の

private static final int QUEENS = 4; // 王妃数

王妃数を 8 に変更してください。

任意の王妃数をこれによって設定できますがあまり王妃数を大きくすると計算量が指数関数的に増加するでしょうからほどほどに(^_^;

a_001

再帰アルゴリズムについてはこちらで簡単な覚え書きを残してあります。

再帰アルゴリズム その1

再帰アルゴリズム その2

ユークリッドの互除法 Euclidean Algorithm

ハノイの塔 Tower of Hanoi

Hatena タグ:

ハノイの塔 Tower of Hanoi

Java

Java でハノイの塔をプログラミングしてみました。

再帰アルゴリズムでググるとほとんどの言語でサンプルがあります。

しかし、再帰アルゴリズムは理屈では理解できても実際に使おうとすると難しいものです。

そこで NetBeans を使って再帰アルゴリズムの仕組みをみていこうと思います。

まず、ハノイの塔についておさらいしておきましょう。

Wikipedia によると、ハノイの塔は、フランスの数学者エドゥアール・リュカが1883年に発売したゲーム『ハノイの塔』がルーツである。

その内容は下記のようになっている。

 

インドのガンジス河の畔のヴァラナシ(ベナレス)に、世界の中心を表すという巨大な寺院がある。

そこには青銅の板の上に、長さ1キュビット、太さが蜂の体ほどの3本のダイヤモンドの針が立てられている。

そのうちの1本には、天地創造のときに神が64枚の純金の円盤を大きい円盤から順に重ねて置いた。

これが「ブラフマーの塔」である。司祭たちはそこで、昼夜を通して円盤を別の柱に移し替えている(移し替えのルールの説明は省略)。

そして、全ての円盤の移し替えが終わったときに、世界は崩壊し終焉を迎える。

 

n 枚の円盤すべてを移動させるには最低 2^n-1 回(2のn乗 – 1 回)の手数がかかります。

なんか恐ろしいですね。

それにハノイの塔じゃなくてブラフマーの塔になってます。( なんでだろう? )

さて。肝心の移し替えのルールをザックリと確認しましょう。

移し替えの際、円盤は一回に一枚しか移し替えできない。

小さな円盤の上に大きな円盤を重ね置くことはできない。

実にシンプルなルールですね。

しかし、シンプルだからといって侮れません。

考え方としては円盤の枚数を n 枚とします。

そして円盤が重ね置いてあるダイヤの針は左( LEFT )とします。

移し替え先のダイヤの針は右( RIGHT )、そして移し替え作業用のダイヤの針を中央( CENTER )とします。

まず、n -1 枚の円盤を中央のダイヤの針に移し替えます。

そして、右のダイヤの針に左のダイヤの針に残っている一番大きな円盤( n 枚目の円盤 )を移し替えます。

次に中央のダイヤの針に移し替えられた n-1 枚の円盤を左のダイヤの針に移し替えます。

言葉よりプログラムの流れで確認したほうが理解し易いかもしれませんね。

上記の考え方を再帰アルゴリズムを利用して組んだコードがこれです。

素人が作ったプログラムなので読みにくいとは思いますがじっくりプログラムの流れを確認してください。

 

yucchi.jp.hanoi.Hanoi.java

どうでしょうか?

理解できましたでしょうか?

考え方は非常にシンプルだけどけっこう流れは追っていくと複雑に感じますね。

いちおう参考までにこれも貼っておきます。

1

hanoi メソッドが再帰的に実行されているのが確認できます。

これで再帰アルゴリズムで複雑な繰り返し処理を記述できるようになったとはとても思えないけど

ちょっとは再帰アルゴリズムの使いどころを理解したつもりになりました。

たぶん、すぐに忘れてしまうだろうけどまた挑戦してみたらいいだけのことだし。

気楽に楽しんでいこう! (*^o^*)

a_001

再帰アルゴリズムについてはこちらで簡単な覚え書きを残してあります。

再帰アルゴリズム その1

再帰アルゴリズム その2

ユークリッドの互除法 Euclidean Algorithm

Hatena タグ:

 


ユークリッドの互除法 Euclidean Algorithm

Java

Java でユークリッドの互除法 Euclidean Algorithm をプログラミングしてみました。

再帰アルゴリズムを使ってます。

再帰アルゴリズムについてはこちらで簡単な覚え書きを残してあります。

再帰アルゴリズム その1

再帰アルゴリズム その2

ユークリッドの互除法とはいったいどんな仕組みなのか調べてみました。

ある二つの自然数の最大公約数を求めるのに非常に優れた方法らしいです。

名前に互除法とあるとおり互いに割り算を行って解を導き出す方法です。

簡単に説明すると自然数 r1 と r 2 ( r1 >= r2 ) の最大公約数を求めるとき ( 注意 : r の後の数字と n は小さい数字だと思ってください。)

r1 / r2 の余り r3 を求める。

次に r2 / r3 の余り r4 を・・・

これを rn が 0 になるまで繰り返す。

この時、 r(n-1) が最大公約数となる。

実にシンプルです。

数学的証明はここでは割愛させていただきます。

これを Java プログラムにするには再帰アルゴリズムを使えば簡単にできそうですね。

さっそく作ってみましょう。

euclidean_algorithm.Euclidean_Algorithm.java

 

非常にシンプルで解りやすいですね。

せっかくだからデバッグ実行させてプルグラムの流れを確認してみよう。

変数 x , y の値に注目です。

main() メソッドの引数二つを整数とし、大きさを比較し計算処理のため必要に応じて値を入れ替え、

再帰メソッドで答えが出るまで(再帰のループから抜ける条件になるまで)ひたすらぐるぐる回るってかんじ。

euclidean_algorithm

ユークリッドの互除法ってシンプルだけど良く考えられた素晴らしいものですね。

最後にすでにお気付きの方もいると思うのですが上記プログラムはちょっと手抜きの部分があります。

目的がユークリッドの互除法を試してみるということなのでご容赦のほどを(^_^;

ちなみに java.lang.NumberFormatException が・・・・・・です。(本当は忘れていたことは内緒です)

a_001

Hatena タグ:

« 古い記事 新しい記事 »