【问题标题】:Removing the content of list without iterating在不迭代的情况下删除列表的内容
【发布时间】:2014-10-31 06:28:52
【问题描述】:

我在 Java 中有一个列表,但有一个条件:如果列表大小超过 10,那么我会在不迭代的情况下删除多余的内容,

例如:如果列表包含{1,2,3,4,5,6,7,8,9,10,11,12,13,14},那么结果应该是

{5,6,7,8,9,10,11,12,13,14}

另外,请注意我使用的 Java 版本是 Java 6。

我已尝试使用 subList,但即使此操作在内部进行迭代,也会导致性能问题。

public List<E> subList(int fromIndex,
                       int toIndex)

【问题讨论】:

  • 如果不迭代列表,您将无法做到这一点。你无法避免它,甚至无法避免List 类实现方法内部的内部迭代。
  • “我已经尝试过使用 subList,但即使这个操作在内部进行迭代,也会导致性能问题。” - 您遇到什么性能问题?你做过一些测试,你能提供结果吗?另外,您是否针对备用列表进行了一些测试?总体来说你是怎么做测试的?
  • @buhake 我正在处理一个非常大的列表,我的客户对花费的时间不满意,所以只需要找出是否有任何解决方法。
  • 您打算通过内置列表来实现这一目标吗?或者你可以实现自己的风格?

标签: java arraylist


【解决方案1】:

我不清楚您为什么要这样做,也许您可​​以通过避免迭代来解释您要解决的问题? that problem 可能有更好的答案。如果您发布 SSCCE,我们可以运行它并直接复制您遇到的问题。

您声称ArrayList.subList() 进行迭代,这根本不是真的。正如文档所述:

返回此列表在指定的 fromIndex(包括)和 toIndex(排他)之间的部分的视图。返回的列表受此列表的支持,因此返回列表中的非结构性更改会反映在此列表中,反之亦然。

此函数在 O(1) 时间内返回一个围绕现有列表的包装器。如果您看到性能问题,那几乎可以肯定不是因为ArrayList.subList()

【讨论】:

  • 即使是这样,迭代也很快。 OP 的代码中还有一些其他错误(可能是 O(n^2) 算法?)。
【解决方案2】:

只是你不能这样做。没有迭代是不可能的。获取前 n 个元素不会造成太大的性能差异。

subList() 方法,这是一个足够优化的内置方法,不用担心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    相关资源
    最近更新 更多