- ベストアンサー
2つのリストをマージする方法とパフォーマンスの向上方法
- 2つのリストを指定のキーでマージする方法について説明します。マージ後のリストはキーの昇順でソートされ、重複するキーはありません。
- 現在のアプローチはパフォーマンスが悪く、バグの可能性もあります。よりスマートな方法とパフォーマンスの向上策について検討します。
- 数万件〜数十万件のリストをマージする場合、効率的な方法としては、二分探索を利用してマージすることが考えられます。二分探索を用いることで、リストのサイズに依存せずに効率的にマージすることができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ああ, 再帰するのは「マージ」とは関係ないですから, とりあえず今は無視してもいいです. で, 形はそんなところ. 実際に動くかどうかは知りませんが....
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
もとのリストが実際にはどのような構造なのかわかりませんが, ごくごく普通のマージを実行すれば事実上終わりでしょう. マージソートについて調べてみてください.
お礼
お返事有難うございます。マージソートを調べてみました。下記が一番分かりやすかったのですが、再帰呼出がいまいちぴんとこなくてまだ理解できていません。 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++; } }
お礼
有難うございました。動作は色々と確認してみます。