我有一个简短的问题。我正在研究一个学校项目,我需要解析一个非常大的文本文件。这是一个数据库类,所以我需要从文件中获取唯一的actor名称,因为actor将是mysql数据库中的主键。我已经编写了解析器并且效果很好,但当时我忘了删除重复项。所以,我决定最简单的方法是创建一个演员arraylist。 (使用ArrayList ADT)然后在我将其打印到新文本文件之前,使用contains()方法检查actor名称是否在arraylist中。如果是我什么也不做,如果不是我将它添加到arraylist并打印到页面。现在该程序运行速度极慢。在arraylist之前,花了大约5分钟。旧的actor文件是180k,没有删除重复项。到目前为止它已经运行了30分钟和12k。 (这次我总共期待100k-150k。)
我把arraylist的大小留空了,因为我不知道文件中有多少个演员,但至少有1-2百万。我想的只是为其大小投入500万并检查它是否完全得到它们。 (简单地检查一下最后的arraylist索引,如果是空的,它没有用完空间。)这会减少时间,因为arraylist不会不断加倍并重新覆盖所有内容吗?还有另一种比这更快的方法吗?我也担心我的电脑在完成之前可能会耗尽内存。任何建议都会很棒。
(我也尝试在文本文件上运行'unique'命令但没有成功。演员名称每行打印1个。(在一列中)我想也许这个命令错了。你怎么会删除重复项在windows或linux命令提示符下的文本文件列?)谢谢你,并且很抱歉这篇长篇文章。我明天会中期并且开始变得紧张。
答案 0 :(得分:4)
使用Set而不是List,这样您就不必检查集合是否包含该元素。 Set不允许重复。
答案 1 :(得分:2)
使用arrayList contains()查找的成本为您提供了大致的O(n)性能。 这样做的次数是我认为的,会导致您的计划失败。
使用Set的HashSet实现。它将为您提供理论上恒定的时间查找,并将自动删除重复项。
答案 2 :(得分:1)
使用java中的内存映射文件来更快地访问大文件
- 而不是ArrayList使用 HashMap 集合,其中键是actor的名称(或哈希码),这将提高自HashMap中的键查找以来的速度非常快