2つのリストのマージ方法について
2つのリストのマージ方法について
下記の要件を満たしたいと考えています。
・リスト1・2をkeyをキーにマージしたい。
リスト1[0]:key=2, value1=b
リスト1[1]:key=3, value1=d
リスト1[2]:key=4, value1=e
・
・
・
リスト2[0]:key=1, value2=A
リスト2[1]:key=2, value2=B
リスト2[2]:key=5, value2=F
リスト2[3]:key=6, value2=G
・
・
・
↓
リスト3[0]:key=1, value1=A, value=""
リスト3[1]:key=2, value1=b, value=B
リスト3[2]:key=3, value1=d, value=""
リスト3[3]:key=4, value1=e, value=""
リスト3[4]:key=5, value1="", value=F
リスト3[5]:key=6, value1="", value=G
・
・
・
・リスト1・2はkeyの昇順でソート済。各リスト内では重複しているkeyはない。
・マージ後もkeyの昇順にしたい。
・実際のリストはそれぞれ数万件~数十万件なので、パフォーマンスを考慮したい。
下記のように作成してみたのですが、無理やりやりました感があり、分かりづらくバグがありそうです。またループでnewもしてたりしてパフォーマンスも悪そうです。もっとスマートにパフォーマンスもよい方法がないでしょうか?
int checkedCount = 0;
for (int i = 0; i < list1.size(); i++) {
String str1 = list1.get(i).get("key");
for (int j = checkedCount; j < list2.size(); j++) {
Map<String, String> map3 = new HashMap<String, String>();
String str2 = list2.get(j).get("key");
if (str1.compareTo(str2) < 0) {
if (i != list1.size() - 1) {
map3.put("key", str1);
map3.put("value1", list1.get(i).get("value1"));
map3.put("value2", "");
list3.add(map3);
break;
} else {
Map<String, String> map4 = new HashMap<String, String>();
map4.put("key", str2);
map4.put("value1", "");
map4.put("value2", list2.get(j).get("value2"));
list3.add(map4);
}
} else if (str1.compareTo(str2) == 0) {
map3.put("key", str1);
map3.put("value1", list1.get(i).get("value1"));
map3.put("value2", list2.get(j).get("value2"));
list3.add(map3);
checkedCount = j + 1;
break;
} else {
map3.put("key", str2);
map3.put("value1", "");
map3.put("value2", list2.get(j).get("value2"));
list3.add(map3);
checkedCount = j + 1;
}
}
}
お礼
ありがとうございました。今回の件は何とかなりました。