【问题标题】:Java ForEach in ArrayList with Locate [duplicate]ArrayList中的Java ForEach与Locate [重复]
【发布时间】:2014-07-23 23:57:34
【问题描述】:

概述:

我正在使用 for-each 循环,我很好奇是否需要用常规的 for 循环替换它们,或者是否有办法在 ArrayList 中进行定位,这会给我等价的跟踪在正常for 循环中使用的索引。

问题的简化版本:

我将 for-each 与 ArrayList 的对象一起使用。这些对象用于在不同时间计算不同的值,因此我需要遍历这些项目并计算几次不同的时间。我希望在一个结构中跟踪这些结果,如果我可以在ArrayList 中找到项目,我可以轻松做到这一点(无需在单独的循环中遍历所有内容)。如果有,那么我可以用它来构建我需要的东西。如果没有,我会将 for-each 替换为 for 循环并获得我需要的功能。

【问题讨论】:

  • 如何找到它们? indexOf()?
  • 对于复杂的对象,要定位List中的元素,基于特定的成员,可以重写参数化类中的equals方法来匹配特定的事物(一个id成员例如)。然后,yourList.contains(new YourClass(4));。它并非适用于所有情况,但应该很有用。
  • @SotiriosDelimanolis,这正是我所需要的,谢谢。
  • @VenomFangs 我不知道你想做什么,但 indexOf 可能是一个相当昂贵的操作,具体取决于列表的大小和列表中对象的类型。
  • @VenomFangs 你也有lastIndexOf,如果你需要得到一个元素的最后一次出现。

标签: java for-loop arraylist foreach


【解决方案1】:

for-each 循环旨在提供一种对集合或数组中的每个元素进行操作的简单方法。如果您想迭代并跟踪指标,您将需要一个普通的 for 循环。

但是,一些Collections(例如Lists)有一个indexOf() 方法,您可以使用它来获取索引。不过那会影响你的表现。

你也可以使用计数器:

int i = 0;
for (Object o : list) {
    // Code
    i++;
}

【讨论】:

    【解决方案2】:

    可以使用常规的for-loop,但有时这不是一个好主意,例如,如果您正在处理元素检索为 O(n) 的链表索引。为什么不只跟踪索引?

    int index = 0;
    for (Element e : list) {
        ...
        index++;
    }
    

    我发现这比普通的 for-loop 更干净,即使您从 ArrayList 更改为另一种非随机访问的列表类型,它也会保持高效。

    【讨论】:

    • 这给了我我所需要的代码更改最少并且运营成本很小。谢谢。
    • @VenomFangs 没问题,很高兴我能帮上忙。
    猜你喜欢
    • 2023-03-09
    • 2012-01-26
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2012-07-02
    • 2018-02-23
    相关资源
    最近更新 更多