• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2つのリストのマージ方法について)

2つのリストをマージする方法とパフォーマンスの向上方法

このQ&Aのポイント
  • 2つのリストを指定のキーでマージする方法について説明します。マージ後のリストはキーの昇順でソートされ、重複するキーはありません。
  • 現在のアプローチはパフォーマンスが悪く、バグの可能性もあります。よりスマートな方法とパフォーマンスの向上策について検討します。
  • 数万件〜数十万件のリストをマージする場合、効率的な方法としては、二分探索を利用してマージすることが考えられます。二分探索を用いることで、リストのサイズに依存せずに効率的にマージすることができます。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ああ, 再帰するのは「マージ」とは関係ないですから, とりあえず今は無視してもいいです. で, 形はそんなところ. 実際に動くかどうかは知りませんが....

_alias_
質問者

お礼

有難うございました。動作は色々と確認してみます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

もとのリストが実際にはどのような構造なのかわかりませんが, ごくごく普通のマージを実行すれば事実上終わりでしょう. マージソートについて調べてみてください.

_alias_
質問者

お礼

お返事有難うございます。マージソートを調べてみました。下記が一番分かりやすかったのですが、再帰呼出がいまいちぴんとこなくてまだ理解できていません。 ttp://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/merge-sort.html ただ今回私がやりたいところは再帰呼出とは直接関係ないようなので(勘違いをしていたらご指摘ください)、下記のように作成しなおしてみましたが、こういった方法ということでしょうか? int i = 0; int j = 0; while (i < list1.size() || j < list2.size()) { Map<String, String> map3 = new HashMap<String, String>(); if (j >= list2.size() || (i < list1.size() && (list1.get(i).get("key").compareTo(list2.get(j).get("key")) < 0))) { map3.put("key", list1.get(i).get("key")); map3.put("value1", list1.get(i).get("value1")); map3.put("value2", ""); list3.add(map3); i++; } else if (j >= list2.size() || (i < list1.size() && (list1.get(i).get("key").compareTo(list2.get(j).get("key")) == 0))) { map3.put("key", list1.get(i).get("key")); map3.put("value1", list1.get(i).get("value1")); map3.put("value2", list2.get(i).get("value2")); list3.add(map3); i++; j++; } else { map3.put("key", list2.get(j).get("key")); map3.put("value1", ""); map3.put("value2", list2.get(i).get("value2")); list3.add(map3); j++; } }

関連するQ&A