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;
}
}
}
お礼
>多分、16桁の2進数を10進数にしているはずです 知りたかったのは、この部分でした! お陰様で、以下のように解析することができました。 サンプルで描かれるのは、 横1ドット×縦36ドット 最初の2,36 とは、 1ドットは4色を表すために2ビット必要なので 横1ドット=「2」ビット 縦「36」ドット 残りの数字を16桁の2進数にする。 -32768 → 1000000000000000 それを8ビットに区切る(2つに区切る) 1000000000000000 → 10000000 00000000 右から順番に縦に並べる 10000000 00000000 ↓ 00000000 10000000 これで上記の数字を並べ替えると、 -32768 00000000 黒 10000000 緑 16384 00000000 黒 01000000 赤 64 01000000 赤 00000000 黒 128 10000000 緑 00000000 黒 0 00000000 黒 00000000 黒 0 00000000 黒 00000000 黒 0 00000000 黒 00000000 黒 0 00000000 黒 00000000 黒 0 00000000 黒 00000000 黒 -32768 00000000 黒 10000000 緑 16384 00000000 黒 01000000 赤 16448 01000000 赤 01000000 赤 16448 01000000 赤 01000000 赤 16448 01000000 赤 01000000 赤 16448 01000000 赤 01000000 赤 64 01000000 赤 00000000 黒 -32640 10000000 緑 10000000 緑 128 10000000 緑 00000000 黒 となる。 4ドット単位でデータが構成されるため、 右側の3ドット分(6ビット)は0で埋められる。 他のデータでも試してみましたが、 すべてこの方法でうまくいきました。 どうもありがとうございました。