如何在java中迭代集合的同时修改集合中的对象

时间:2013-07-18 19:23:54

标签: java arraylist hashset

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

URL total hits delayed response
url1     100     5 
url2     1000    18

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

1 个答案:

答案 0 :(得分:8)

  

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

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

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<URL, HitData>。然后逐行读取文件,并且每次遇到必须报告的行时,都会尝试在地图中获取相应的条目。如果没有,请创建一个新的。如果存在,或者修改它,或者(如果你喜欢不可变类型),创建一个新条目并替换旧条目。