問題J04020の解答例と解説 Java Lv.3
連結リストのループの検知(30分)
<解答例 1>
F11キーでフルスクリーンモード、Escキーで元に戻ります。
object から「通ったことがあるかどうか」がわかるように HashSet の中に子オブジェクトを登録しながら、子オブジェクトをたどっていっていくよ。
<解答例 2>
F11キーでフルスクリーンモード、Escキーで元に戻ります。
この問題ではオブジェクトの名前はユニークだと言っているので、名前でチェックしても良いよ。それ以外は解答例1と同じやり方。だけど、HashSetのcontains は、String.equals() での比較を行なうので、オブジェクトの名前の文字列が長いと、文字列比較をする分、<解答例2>の方が遅くなるよ。
<解答例 3>
F11キーでフルスクリーンモード、Escキーで元に戻ります。
再帰呼び出しして、HashSet をメンバ変数に使った例。連結リストの数が少なければこれでもいいけど、多いと StackOverfllowError という例外がスローされてエラーになるよ。
<解答例 4> 不正解
F11キーでフルスクリーンモード、Escキーで元に戻ります。
子オブジェクトがないオブジェクトを再帰的に探そうとするプログラム。けれどもこれではループがあるときに無限ループしてしまう。
<解答例 5>
F11キーでフルスクリーンモード、Escキーで元に戻ります。
Class1 にメンバ変数を追加したくなければ、メソッドを1つ追加して、このように実装しても良いよ。こうすれば、Class1 オブジェクトが消費するメモリ量を節約できるよ。連結リストの数が多いときの StackOverfllowError は避けられないよ。
初めての方へ:このページは、このサイトで用意しているプログラミング問題の解答と解説のページです。このサイトではブラウザ上からプログラミングができます。会員登録(無料)して、プログラミングしてみませんか?
新規登録
新規登録