java - 如何在线性时间内从arraylist中删除元素
问题描述
很好的建议,但其中一些是不允许的(作为流),是非常有限的任务。Leo 的算法正是我一直在寻找的东西。
我正在尝试比较 arraylist 元素上的特定字母,并且需要从 arraylist 中删除每个更大的字母。这必须在线性时间内完成,因此remove()
不是一种选择。我该怎么做?
int deleted = 0;
int n = 0;
while (n < A.size()) {
if (A.get(n).compareTo(x) > 0) {
//removing here
removed = removed + 1;
}
n++;
}
return removed;
A
是一个带有随机字母的数组列表,x
也是一个随机字母。我需要删除每个A
大于给定x
字母的元素。Remove() 不是一个选项,因为我需要在线性时间内而不是 n^2 中执行此操作。
解决方案
您可以在线性时间内将元素添加到另一个列表中。例如:
ArrayList<Integer> result = new ArrayList<Integer>();
for(int n = 0; n < A.size(); n++) {
if(A.get(n).compareTo(x) <= 0) {
result.add(A.get(n));
}
}
return result;
或@Dici 所说的流:
A.stream().filter(n -> n.compareTo(x) <= 0).collect(Collectors.toList());
您可以稍后交换列表,或清除原始列表,然后从result
该列表的后面复制值,这也需要线性时间。
尽管使用另一种数据结构来存储数据也可能是有益的。
推荐阅读
- javascript - ReactJS 和 ChartJS - getElementAtEvent 在控制台中有效,但在代码中无效
- awk - 从鹈鹕迁徙到雨果
- python - 如何在 Python 3 中检查给定数字是否为阶乘
- node.js - 如何使用 POST 方法将在代码编辑器中编写的代码发送到服务器
- javascript - JavaScript 表单验证 2 个字母 1 个数字
- python - 从给定模板生成文本
- r - 测试 tidyverse 中的列数
- swift - 具有前景色的属性文本中的 NSTextAttachment 图像
- multithreading - 在单独的线程中调用每个任务。ThreadPerTaskScheduler 任务调度器
- php - 如何在实时 Firebase 数据库上侦听以通过后端 laravel 和 websocket 动态获取数据,而不使用 javascript