1

我有一个快速的问题。我正在做一个学校项目,我需要解析一个非常大的文本文件。这是一个数据库类,所以我需要从文件中获取唯一的演员名称,因为演员将是 mysql 数据库中的主键。我已经编写了解析器并且效果很好,但当时我忘记删除重复项。所以,我决定最简单的方法是创建一个演员数组列表。(使用 ArrayList ADT)然后使用 contains() 方法检查演员名称是否在 arraylist 中,然后再将其打印到新的文本文件中。如果是我什么都不做,如果不是我将它添加到数组列表并打印到页面。现在程序运行非常缓慢。在arraylist之前,大约花了5分钟。旧的演员文件是 180k,没有删除重复项。现在它已经运行了 30 分钟,到目前为止是 12k。

我将arraylist的大小留空,因为我不知道文件中有多少个演员,但至少有1-2百万。我当时正在考虑只投入 500 万美元,然后检查它是否得到了全部。(只需检查最后一个 arraylist 索引,如果为空,它没有空间不足。)这会减少时间,因为 arraylist 不会不断加倍并重新复制所有内容吗?还有比这更快的方法吗?我还担心我的计算机在完成之前可能会耗尽内存。任何建议都会很棒。

(我也尝试在文本文件上运行“唯一”命令但没有成功。演员名称每行打印 1 个。(在一列中)我在想命令可能是错误的。如何从文本文件列中删除重复项在 Windows 或 linux 命令提示符下?)谢谢你,很抱歉这么长的帖子。我明天有期中考试,开始感到压力。

4

3 回答 3

4

使用 Set 而不是 List,这样您就不必检查集合是否包含该元素。Set 不允许重复。

于 2013-04-08T07:44:41.887 回答
2

使用 arrayList contains() 查找的成本大约为您提供 O(n) 性能。我认为这样做一百万次,会杀死你的程序。

使用 Set 的 HashSet 实现。理论上,它将为您提供恒定的时间查找,并会自动为您删除重复项。

于 2013-04-08T07:52:32.073 回答
1

-尝试在java中使用内存映射文件以更快地访问大文件

- 而不是 ArrayList 使用HashMap集合,其中键是演员的姓名(或哈希码),这将大大提高速度,因为在 HashMap 中查找键非常快

于 2013-04-08T07:47:55.570 回答