【问题标题】:Order of the "for" instruction over Array<>Array<> 上的“for”指令的顺序
【发布时间】:2014-02-21 10:33:32
【问题描述】:

在我的代码中我有这个:

Array<Block> blocks;

在不同的时间,对象被添加到该数组中,并且我需要定期检查其中哪些对象太旧并且需要删除。

我使用for指令:

    Array<Block> to_be_removed = new Array<Block>();
    for (Block b : blocks) {
        if (shouldBeRemoved(b)) {
            to_be_removed.add(b);
        }
    }
    blocks.removeAll(to_be_removed, true);

函数shouldBeRemoved 的构造方式是,应该删除的块始终是最旧的(已在其他块之前添加)。

我想要优化这个功能:如果我假设for 循环将遍历对象按照添加的顺序,那么一旦我到达一个不应该出现的块通过不检查其他块的条件,我可以打破循环并节省大量时间(通常每次迭代必须从总共 25-35 个块中删除大约 5-9 个块)。

我的问题是:我应该使用什么样的结构来确保for 循环按对象的“年龄”迭代对象(即较旧的对象首先出现)。是Array、List、ArrayList、Set等吗?

谢谢!

【问题讨论】:

  • 您可以使用LinkedList。它实现了Queue接口,所以它提供了add和poll在末尾添加元素并在前面删除它们。
  • 如果对象的数量在 25-35 左右并且您最多删除 10 个,我认为您拥有的东西是好的。看来您正在寻找过早的优化。记住这句话-Premature optimization is the root of all evil。话虽这么说,如果您的shouldBeRemoved 逻辑非常复杂,也许您应该专注于这一点。考虑为Block 实现Comparator 接口。但话又说回来,我可能让它变得比现在更复杂。

标签: java android arrays for-loop


【解决方案1】:

如果您使用ArrayList 并始终使用add(E object) 方法添加新元素(而不是使用指定新元素索引的重载方法),那么根据Android documentation,这将按您的意愿工作, 它

在此 ArrayList 的末尾添加指定的对象。

因此,当您使用 for ( : ) 循环遍历列表时,它将从最旧的元素开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多