for(int i = 0; i < points.size(); i = i+lines) {
points.remove(i);
}
这里的想法是用户可以通过输入int
“ line”来跳过数组的每个其他空格或第三个空格或第四个空格。等等。 。但是,我意识到每次弄到跳过值时列表都会变小。我该如何处理?我正在使用Java的ArrayList
库,因此不能选择仅在数组列表类中添加方法。任何帮助将不胜感激。
答案 0 :(得分:4)
到目前为止,我已经perfomed a benchmark对这个问题提出了所有答案。
对于具有约100K个元素(每个字符串)的ArrayList,结果如下:
removeUsingRemoveAll took 15018 milliseconds (sleepToken)
removeUsingIter took 216 milliseconds (Arvind Kumar Avinash)
removeFromEnd took 94 milliseconds (WJS)
从ArrayList中删除元素是一项Θ(n)操作,因为它必须将数组中所有剩余的元素向左移动(即,速度很慢!)。 WJS建议首先从列表末尾删除元素的建议似乎是迄今为止提出的最快的(就地)方法。
但是,对于这个问题,我强烈建议考虑使用诸如LinkedList之类的替代数据结构,该结构旨在使列表中间的元素快速移除(或添加)。如果您有足够的内存,另一种选择是将结果存储在单独的列表中,而不是尝试就地修改列表:
removeUsingIterLinked took 12 milliseconds
removeUsingSecondList took 3 milliseconds (sleepToken with WJS's comment)
答案 1 :(得分:3)
使用带有计数器的迭代器,例如以下代码将删除所有其他(即每2nd个)元素(从索引0
开始):
Iterator<Point> itr = points.iterator();
int i = 0;
while(itr.hasNext()) {
itr.next();
if(i % 2 == 0) {
itr.remove();
}
i++;
}
在这里,我使用i
作为计数器。
类似地,您可以使用条件i % 3 == 0
删除每个第三个元素(从索引0
开始)。
答案 2 :(得分:2)
您可以将它们添加到新的ArrayList中,然后在迭代后删除所有元素。
您可以设置count
删除第count
个元素。
import java.util.ArrayList;
public class Test {
static ArrayList<String> test = new ArrayList<String>();
public static void main(String[] args) {
test.add("a");
test.add("b");
test.add("c");
test.add("d");
test.add("e");
ArrayList<String> toRemove = new ArrayList<String>();
int count = 2;
for (int i = 0; i < test.size(); i++) {
if (i % count == 0) {
toRemove.add(test.get(i));
}
}
test.removeAll(toRemove);
System.out.print(test);
}
}
答案 3 :(得分:2)
这是另一种方法。只需从头开始,然后反向取下即可。这样,您就不会搞乱索引同步。为确保删除从开头的第二个项目开始,请确保从最后一个奇数索引开始。那就是list.size()&~1 - 1
。如果size为10,则将从9开始。如果size为11,则将从9开始
List<Integer> list = IntStream.rangeClosed(1,11)
.boxed().collect(Collectors.toList());
for(int i = (list.size()&~1)-1; i>=0; i-=2) {
list.remove(i);
}
System.out.println(list);
打印
[1, 3, 5, 7, 9, 11]