【问题标题】:How to modify objects in a collection at the same time while iterating through the collection in java [duplicate]如何在Java中迭代集合时同时修改集合中的对象[重复]
【发布时间】:2013-07-18 19:23:53
【问题描述】:

我有这种情况:
有一个大约 500MB 的巨大文本文件,我必须通过其内容使 reports.Each 行具有一些值,这些值由几个值的 space.out 分隔,其中两个是 URL 和 RESPONSETIME。如果一个 url 的响应时间超过 8000 毫秒,我必须报告该 url 总共被点击了多少次,其中有多少次响应时间大于 8000 毫秒,所以最终报告看起来像这样

URL total hits delayed response
url1     100     5 
url2     1000    18

我已经在谷歌上完成了我的搜索,所以不要建议我这样做。使用列表不是解决方案,因为您无法在迭代列表时修改列表的对象。
请任何人提出想法。

【问题讨论】:

  • 这个问题不是上面提到的问题的重复。该问题是询问如何从列表中删除项目。这个问题是关于修改列表中的项目。 Jon Skeet 在下面的回答清楚地说明了这一点。

标签: java arraylist hashset


【解决方案1】:

使用列表不是解决方案,因为您无法在迭代列表时修改列表的对象。

是的,你可以。您无法更改列表本身(添加项目、删除项目或替换项目),但您可以修改列表引用的对象。例如:

List<StringBuilder> builders = new List<StringBuilder>();
builders.add(new StringBuilder());

for (StringBuilder builder : builders) {
    builder.append("This changes the builder but not the reference in the list");
}

但是,您是否真的需要将所有行加载到列表中并不完全清楚。这并不能帮助您按 URL 进行聚合,这听起来像是您真正需要做的。

感觉你应该有一个Map&lt;URL, HitData&gt;。然后逐行读取文件,每当遇到必须报告的行时,您都会尝试获取映射中的相应条目。如果没有,则创建一个新的。如果有,要么修改它,要么(如果您像我一样喜欢不可变类型)创建一个新条目并替换旧条目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-07
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2011-11-14
    • 2011-03-31
    相关资源
    最近更新 更多