- ベストアンサー
String配列とHashMap
メソッドの引数の数がとても多いので、String配列かHashMapにまとめて、値を渡すことになりました。 どちらを使うかなのですが、私の記憶だとString配列とHashMapの違いを次のように認識してるのですが、調べても答えが見つかりません。合ってるか教えてください。 String配列は、インデックスを検索しつつ値を取得してるので、インデックスの大きい番号ほど、値取得時の処理に時間を使う。HashMapは、特別な検索方法(?)で検索してるので、値取得時の処理に、時間をかけずにすむ。 なので、メソッドの引数として使うのはHashMapの方がよい。 メソッドの引数という性格上、要素数を固定しなくてもいいHashMapの方が使いやすいと思ってるのですが、現場のリーダーさんの認識とずれちゃってます。説得したいので、この辺りのことが解説されているサイトがありましたら、合わせて教えていただけると嬉しいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
他の方の意見と同じですが、設計を見直した方がよろしいのではないでしょうか。 そもそも引数というのは、一つ一つに意味があって成り立つはずなのに、まとめられる事自体が異常ともいえます。 単にまとめるだけなら、配列の方がいいんじゃないかな・・と思います。 検索キーもいらないですし。 質問者さんは勘違いされているようですが、「引数」なんですよね? どっちにしろ全部にアクセスしなくてはいけませんよね? 引数が20個あって、String配列にまとめるならば main()側 String[] arg = new String[20]; arg[0] = string1; arg[1] = string2; : : arg[19] = string20; ans = func(arg); 呼ばれる側 func(String[] arg){ for(int i=0; i < arg.length; i++){ param = arg[i]; } } かな? だとしたら、HashMapを使う場合はどうするのでしょうか? main()側 HashMap hMap = new HashMap(); hMap.put("key1", string1); hMap.put("key2", string2); : : : hMap.put("key20", string20); func(hMap); 呼ばれる側 func(HashMap hMap){ int size = hMap.size(); for(int i=1; i <= size; i++){ String key = "key"+i; String param = (String)hMap.get(key); } } こうするのでしょうか?そしたら、どっちが速いと思いますか?
その他の回答 (4)
- Werner
- ベストアンサー率53% (395/735)
> 以前、仕事のできる人に、「実は、配列の検索は値を順番になめてるんだよ」って聞いた事があるんです。 > その人曰く、インデックスの5番目を見つけるために、インデックスの1番目を開いて、次はインデックスの2番目を開いて・・・って > 順次確認し、インデックスの5番を見つけるのだそう。 配列の「検索」とは、普通はある値がインデックスの何番目に存在するか調べることを言うのでは? 例えば文字列値"aaa"を探すために、インデックスの0番目、1番目、2番目…と探していって4番目で見つかった、というふうに。 配列でインデックスから値を「参照」するのには時間はかかりません。(定数時間のはず) HashMapはキーと値のペアの集まりで、キーに対応する値を高速に参照できるのが特徴ですが、 その用途でキーから値を参照したいという要求はあるのでしょうか? 0から始まる整数で値を参照できる配列で十分な気がしますが。 要素数が変化するならVectorクラスが使えそうだし。 設計見直した方が良さそうというのは私も思いました。 例えば、その引数群をメンバ変数にしたクラスを新たに作った方が自然になるとかそういうことはない? あと、引数を配列にしても、増減のたびにメソッド内のロジックを書き換える必要があるなら 手間は大して変わらない気がします。 逆に、配列にしておくことで要素数が増減したときの変更がなくなるなら 配列にするのが自然だと思います。
お礼
ここの処理だけを考えたら設計を見直した方がいいのはもちろんなのですが、他の機能との平仄があって、そうもいかないんです・・・。 >その引数群をメンバ変数にしたクラス これも提案したんですが、即効却下でした。笑。 絶対、この方が自然な処理なんですが、この機能だけ独自性に走るわけにもいかないんです。 配列を使う方向で考えます。 いろいろ勉強になりました。 ありがとうございました。
- isle
- ベストアンサー率51% (77/150)
>「実は、配列の検索は値を順番になめてるんだよ」って聞いた事があるんです。 あるハードウェアをエミュレートしてるアプリがあるんですが、 byte型配列にROMイメージを読み込んで処理してます。 その理論だと死ぬほど遅くなりそうですね。
お礼
皆さんに回答いただいて、私の勘違いの気がしてきました。 どうもありがとうございました。
- koko_u_
- ベストアンサー率18% (459/2509)
>「実は、配列の検索は値を順番になめてるんだよ」って聞いた事があるんです。 Java の実装がどうなっているかは知りませんが、リストではなくて「配列」が要素の検索に O(n) 時間かかるとすると、多くのアルゴリズムで困ったことになるのでは? 詳しい人カモーン > 誰か
- koko_u_
- ベストアンサー率18% (459/2509)
>String配列は、インデックスを検索しつつ値を取得してるので 配列なら単純に、(String型のサイズ)*index を計算しているだけじゃないのかな? >特別な検索方法(?)で検索してるので、値取得時の処理に、時間をかけずにすむ。 逆に HashMap の方がハッシュ関数を計算するのに時間がかかるのでは? ただ、キーワード引数のような形にしたいのであれば HashMap を使うことになると思います。 >メソッドの引数という性格上、要素数を固定しなくてもいい Java なら、配列も要素数を固定していないと思うのですが。 そもそもの話として、引数の数が多いはどのくらいなのですか?関数の設計を見直した方が早いに一票。
お礼
早い回答ありがとうございます! >配列なら単純に、(String型のサイズ)*index を計算しているだけ 以前、仕事のできる人に、「実は、配列の検索は値を順番になめてるんだよ」って聞いた事があるんです。その人曰く、インデックスの5番目を見つけるために、インデックスの1番目を開いて、次はインデックスの2番目を開いて・・・って順次確認し、インデックスの5番を見つけるのだそう。 その説を信じるなら、HashMapの方が早いと思ったのですが・・・。違うのかしら。 >Java なら、配列も要素数を固定していない ですね。固定ではなく、いちいち宣言する、でした。 今後、要素数の増減が予想されるので、HashMapの方が便利だと思ったんです。 配列のインデックスを定数で切ってキーワードの様にするって手もありますが、いまいちスマートじゃないかなぁと。 引数の数は10くらいです。まだ増えるかも。 他の機能でも、同じ様な処理を関数で切って引数で渡してるので、ここでも平仄をとることになりました。 たしかに不自然ですよね。うーむ。
お礼
>質問者さんは勘違いされているようですが、「引数」なんですよね? >どっちにしろ全部にアクセスしなくてはいけませんよね? はい。そうです。 むしろ、関数なんかにきらない方が自然な処理と言えるのですが、そういうわけにもいかず・・・。 やっぱり、配列の方が早いんですねー。 配列を使う方向で考えます。 いろいろ勉強になりました。 勘違いしてたこともわかりました。 ありがとうございます!