【发布时间】:2018-09-26 02:55:59
【问题描述】:
我想计算元素的数量并在它们符合标准时删除一些。使用 collect 和 removeAll 删除不起作用,因为它删除了所有相等的元素,我想删除一个范围而不是全部。 我尝试使用 sublist.clear() 但我得到 ConcurrentModificationException 即使我正在使用 it.remove()。
public static List<Integer> controlOccurrences(List<Integer> sortedArr, int m) {
int writelndex = 0, count=1;
List<List<Integer>> toRemove = new ArrayList<>();
for (int i = 1; i < sortedArr.size(); ++i) {
if (sortedArr.get(i-1).equals(sortedArr.get(i))) {
count++;
} else {
if(count == m) {
int nCopies = Math.min(2,m);
List<Integer> c = sortedArr.subList(writelndex + nCopies, i);
toRemove.add(c);
}
count = 1;
writelndex = i;
}
}
Iterator<List<Integer>> iterator = toRemove.iterator();
while (iterator.hasNext()) {
List<Integer> integers = iterator.next();
iterator.remove();
integers.clear();
}
return sortedArr;
}
编辑:添加示例:
假设我们有以下列表: (1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5) 和 m = 3。这意味着所有出现 m 次的数字应该发生 2 次 (Math.min(2,3))。所以预期的结果是 (1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 5)。
编辑 2:@ShubhenduPramanik 非常优雅地解决了这个任务。 但是,我仍然不清楚为什么会抛出 ConcurrentModificationException,即使我正在使用 iterator.remove() 以及如何在迭代列表时从列表中删除子列表。
【问题讨论】:
-
您使用的是哪个 Java 版本?
-
@Mansuro 1.8。我也很高兴听到新版本中的解决方案。
-
@Mooshstv 您的问题不清楚。请给出示例输入和预期输出。
-
@ShubhenduPramanik 我添加了一个例子,希望现在更清楚了。
标签: java collections iterator