• ベストアンサー

Vectorを要素とするVector

初めまして。 迷路の順路探索を行うプログラムを作成し、 その際Point型の座標データを始点から一定の歩数まで順に並べたVector型オブジェクトrouteと、 そのrouteを要素に持つVector型オブジェクトstoreを定義しました。 ところが、新しく探索したrouteをstore.addElement(route)で追加したところ、 storeの全要素が新しいrouteで上書きされてしまいました。 結果、探索が一方向にしか進まないという状態で詰まっています。 SunのVectorクラスの仕様を読んでも解決の糸口らしいものが見えないのですが、 何かこの現象を回避する方法はないものでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

オブジェクト渡しは値渡しではなくて、参照渡しだからです。 #1さんの通り新しくnewしてもいいですし、渡すときにcloneメソッドでクローンを生成して渡してもいいと思います。 ちなみにこれはVectorだけに限った話ではないので、オブジェクト渡ししている場合は気をつけた方がいいです。(仕事で何度泣いたことか…)

etendard
質問者

お礼

御回答ありがとうございます。 cloneを使って強制的に値渡し扱いにする手は盲点でした。 先ほど試してみた結果、見事にエラー解消です。 本当にありがとうございました。

その他の回答 (1)

  • yamada46
  • ベストアンサー率39% (13/33)
回答No.1

新しく探索したrouteのベクターをnewせずに、以前のやつを再利用してるからでしょうか? import java.awt.Point; import java.util.Vector; public class VTest { public static void main(String[] args) { Vector store = new Vector(); Vector route = new Vector(); for (int i = 0; i < 10; i++) { route.addElement(new Point(i, i)); } store.addElement(route); route = new Vector(); for (int i = 10; i < 20; i++) { route.addElement(new Point(i, i)); } store.addElement(route); } } こんな感じでどうなんでしょうか?

etendard
質問者

お礼

御回答ありがとうございます。 確かに、newで宣言してしまうのはひとつの方法ではあるのですが、 今回作成しているアルゴリズムでは 「探索元の座標までの経路を格納したrouteに、新しい探索先の座標を付加する」 という形式を取っているためにnew宣言は難しいと思います。 ちなみに、routeは探索実行メソッドに対して引数として渡していたため、 ローカル変数扱いで大丈夫だと思っていたのですが…… やはり、オブジェクトは値ではなく参照で渡されてしまうようですね。 探索の結果、元値が変更されてしまいました。

関連するQ&A