У меня есть два списка в гнезде для цикла. Когда я сопоставлял элемент внутри, я хочу удалить его, чтобы производительность работала.Как удалить элемент в списке?
List<String[]> brandList = readCsvFile("/tmp/brand.csv");
List<String[]> themeList = readCsvFile("/tmp/theme.csv");
for (String[] brand : brandList) {
for (String[] theme : themeList) {
if (brand[0].equals(theme[0])) {
themeList.remove(theme);
}
}
}
У меня ошибка java.util.ConcurrentModificationException
. Если я изменил CopyOnWriteArrayList, ошибка, как показано ниже:
CopyOnWriteArrayList<String[]> themeList = (CopyOnWriteArrayList<String[]>)readCsvFile("/tmp/theme.csv");
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.concurrent.CopyOnWriteArrayList
Теперь, как я могу сделать? опустить удалить? или в любом случае?
Я думаю, что это то, что мне нужно:
List<String[]> brandList = readCsvFile("/tmp/brand.csv");
List<String[]> themeList = readCsvFile("/tmp/theme.csv");
for (String[] brand : brandList) {
List<String[]> toRemove = new ArrayList<String[]>();
for (String[] theme : themeList) {
if (brand[0].equals(theme[0])) {
toRemove.add(theme);
}
}
for (String[] theme : toRemove) {
themeList.removeAll(theme);
}
}
Ваш код не то, что я хочу, я могу поместить themeList.removeAll (toRemove); внутри внешней петли? – mikezang
Более эффективно размещать это вне петель, так как выполняется только одна операция удаления для всех элементов, которые необходимо удалить. Это, конечно, возможно, но из этого фрагмента кода я не вижу, где лежит семантическая разница. – chucktator
Ваш ответ дал мне идею, спасибо! – mikezang