删除数组列表中的所有其他元素

时间:2020-05-17 00:03:34

标签: java arraylist

for(int i = 0; i < points.size(); i = i+lines) {
    points.remove(i);
}

这里的想法是用户可以通过输入int“ line”来跳过数组的每个其他空格或第三个空格或第四个空格。等等。 。但是,我意识到每次弄到跳过值时列表都会变小。我该如何处理?我正在使用Java的ArrayList库,因此不能选择仅在数组列表类中添加方法。任何帮助将不胜感激。

4 个答案:

答案 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]

相关问题