【问题标题】:Fastest way to remove the null elements in a list删除列表中空元素的最快方法
【发布时间】:2014-06-17 21:10:10
【问题描述】:

有没有快速删除的方法 链表中的 null 元素?

我知道的唯一方法是迭代 元素并删除空元素。

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

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

编辑:我能想到的一个是将元素放入一个集合中,然后再次放回列表中。这不会保留订单,但是会在其他情况下工作(?)

【问题讨论】:

  • 嗯,多线程可以提供帮助——两个线程从两端向中间移动。不过不太清楚这将如何实现。
  • 我不知道有哪一种,我也想不出它会如何工作。链接列表用于顺序访问,而不是随机访问,所以我相信您只需遍历所有项目。
  • 从技术上讲,遍历或编辑链表的唯一方法是迭代。这就是链表的定义。此外,如果您在链接列表中有空元素,从技术上讲,您将拥有一个损坏的列表。
  • @Humdinger 为什么链表中的null 元素会破坏它? null 元素在 Java 的实现中是完全合法的。这是否意味着 Java 的实现被破坏了?
  • @user3582094 这是一种边缘情况,多线程最多只能帮助 2 个线程。

标签: java list data-structures linked-list


【解决方案1】:

除非您有一个指向列表中间的迭代器,否则多线程将无济于事* 。使用ListIterator<T> 的简单迭代应该可以解决问题:

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 请注意,无论是拆分列表并将其重新组合在一起,还是基于索引的操作在链表上都不是有效的,因此您的多线程示例不会真正起作用。
  • 2 个线程——每端一个就可以了。切碎它仍然需要迭代,没有帮助。
【解决方案3】:

while(list.remove(null)); 可以工作,但在大型列表中可能会很慢

编辑:在 java 8 中,您可以使用list.parallelStream().filter((e)-&gt;e!=null),如果您需要再次将结果作为链表,您可以使用new LinkedList(Arrays.asList(stream.toArray));

【讨论】:

【解决方案4】:

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

    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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2010-11-23
    • 2019-04-06
    • 1970-01-01
    • 2016-02-11
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多