次のようなリストがあります。
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> row;
row = new HashMap<String, String>();
row.put("page", "page1");
row.put("section", "section1");
row.put("index", "index1");
list.add(row);
row = new HashMap<String, String>();
row.put("page", "page2");
row.put("section", "section2");
row.put("index", "index2");
list.add(row);
row = new HashMap<String, String>();
row.put("page", "page3");
row.put("section", "section1");
row.put("index", "index1");
list.add(row);
行 (マップ) の 3 つの要素 (「セクション」、「インデックス」) のうち 2 つが同じであることに基づいて、重複を削除する必要があります。これは私がやろうとしていることです:
for (Map<String, String> row : list) {
for (Map<String, String> el : list) {
if (row.get("section").equals(el.get("section")) && row.get("index").equals(el.get("index"))) {
list.remove(el);
}
}
}
で失敗しjava.util.ConcurrentModificationException
ます。これを行う別の方法があるはずですが、方法がわかりません。何か案は?
更新:提案されているように、イテレータを使用しようとしましたが、それでも同じ例外です:
Iterator<Map<String, String>> it = list.iterator();
while (it.hasNext()) {
Map<String, String> row = it.next();
for (Map<String, String> el : list) {
if (row.get("section").equals(el.get("section")) && row.get("index").equals(el.get("index"))) {
list.remove(row);
}
}
}
UPDATE2:これは同じ例外で失敗します:
Iterator<Map<String, String>> it = list.iterator();
while (it.hasNext()) {
Map<String, String> row = it.next();
Iterator<Map<String, String>> innerIt = list.iterator();
while (innerIt.hasNext()) {
Map<String, String> el = innerIt.next();
if (row.get("section").equals(el.get("section")) && row.get("index").equals(el.get("index"))) {
innerIt.remove();
//it.remove(); //fails as well
}
}
}
更新 3、ソリューション:面倒なほどシンプル:
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size(); j++) {
if (list.get(i).get("section").equals(list.get(j).get("section")) && list.get(i).get("index").equals(list.get(j).get("index"))) {
list.remove(i);
}
}
}
更新 4:「解決策」が意図したとおりに機能しませんでした。正解が選択されました。