2

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

URL total hits delayed response
url1     100     5 
url2     1000    18

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

4

1 回答 1

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>。然后逐行读取文件,每当遇到必须报告的行时,您都会尝试获取映射中的相应条目。如果没有,则创建一个新的。如果有,要么修改它,要么(如果您像我一样喜欢不可变类型)创建一个新条目并替换旧条目。

于 2013-07-18T19:27:22.347 回答