Java 删除列表中空元素的最快方法

Java 删除列表中空元素的最快方法,java,list,data-structures,linked-list,Java,List,Data Structures,Linked List,有没有一种快速的方法可以移除 链接列表中的空元素 我知道的唯一方法是在 元素并删除空的元素 我看不出多线程有什么帮助——链表不能直接访问其成员 //////////////////////////////// 编辑:我能想到的一个方法是将元素放入一个集合,然后再次返回列表。这不会保留顺序,但是每隔一段时间(list.remove(null)),它就会工作可以工作,但在大列表上可能会很慢 编辑:在Java8中,您可以执行list.parallelStream().filter((e)->e!=nu

有没有一种快速的方法可以移除 链接列表中的空元素

我知道的唯一方法是在 元素并删除空的元素

我看不出多线程有什么帮助——链表不能直接访问其成员

////////////////////////////////

编辑:我能想到的一个方法是将元素放入一个集合,然后再次返回列表。这不会保留顺序,但是每隔一段时间(list.remove(null)),它就会工作可以工作,但在大列表上可能会很慢


编辑:在Java8中,您可以执行
list.parallelStream().filter((e)->e!=null)
如果您再次需要结果作为链接列表,您可以执行
新建链接列表(Arrays.asList(stream.toArray))

除非有一个迭代器指向列表的中间,否则多线程将不会有帮助*。使用
ListIterator
的简单迭代应该可以达到以下目的:

ListIterator<String> iter = list.listIterator();
while (iter.hasNext()) {
    if (iter.next() == null) {
        iter.remove();
    }
}
ListIterator iter=list.ListIterator();
while(iter.hasNext()){
if(iter.next()==null){
iter.remove();
}
}

*那是在我们考虑到链表没有外部同步是线程安全的之前。

你说的最快是什么意思?最少的操作可能只是一个接一个地进行。如果使用多线程,您可能需要将列表切碎并重新组合起来,或者获取索引,然后反向遍历列表并手动删除每个索引。

这是一种非常快速的方法。最坏的情况是,它比只遍历一次要慢。但在大多数情况下,速度会更快

    ArrayList a = new ArrayList<Integer>();
    Collections.sort(a);
    for(int i=a.size()-1; i>-1; i--)
    {
        if(a.get(i)==null)
            a.remove(i);
        else
            break;
    }
ArrayList a=新的ArrayList();
收集.分类(a);
对于(int i=a.size()-1;i>-1;i--)
{
如果(a.get(i)=null)
a、 删除(i);
其他的
打破
}

好吧,多线程可能会有所帮助——两个线程从两端向中间移动。但我不太确定这将如何实现。我不知道有一个,也不知道如何实现。链表是用于顺序访问的,而不是随机访问的,因此我相信您只需循环访问所有项目。从技术上讲,遍历或编辑链表的唯一方法是通过迭代。这就是链表的定义。另外,如果在链表中有空元素,从技术上讲,你会有一个断开的列表。@Humdinger为什么链表中的
null
元素会断开它
null
元素在Java实现中是完全合法的。这是否意味着Java的实现被破坏了?@user3582094这是一个边缘案例,多线程最多只能帮助2个线程。这比迭代要慢。迭代最多只能查看n个元素,而您的解决方案可以遍历更多的元素。请看另请注意LinkedList本身对同步不安全,您需要从外部对其进行同步。请参见@user1071777。谢谢请注意,无论是将列表切碎并重新组合起来,还是基于索引的操作都不能有效地处理链表,因此多线程示例不会真正起作用。2个线程——每端一个线程就可以了。切碎它仍然需要迭代,没有任何帮助。