在java中存储和访问120000个单词的最佳方法
我正在编写一个严格读取文本文件(.txt)的java应用程序。这些文件最多可包含120000个字 应用程序需要存储所有+120000个字。它需要将它们命名为word_1、word_2等,还需要访问这些单词以对它们执行各种方法 这些方法都与字符串有关。例如,将调用一个方法来说明word_80中有多少个字母。将调用另一种方法来说明word_2200中的特定字母 此外,有些方法会比较两个词。例如,将调用一个方法来比较单词_80和单词_2200,并需要返回哪个字母更多。将调用另一个方法来比较单词_80和单词_2200,并需要返回两个单词共享的特定字母 我的问题是:因为我几乎只处理字符串,所以最好将这些单词存储在一个大的ArrayList中吗?几个小数组列表?或者我应该使用许多其他存储方法中的一种,比如向量、哈希集、链接列表 我主要关心的两个问题是1.)访问速度,和2.)拥有尽可能多的预构建方法供我使用 提前感谢您的帮助在java中存储和访问120000个单词的最佳方法,java,storage,Java,Storage,我正在编写一个严格读取文本文件(.txt)的java应用程序。这些文件最多可包含120000个字 应用程序需要存储所有+120000个字。它需要将它们命名为word_1、word_2等,还需要访问这些单词以对它们执行各种方法 这些方法都与字符串有关。例如,将调用一个方法来说明word_80中有多少个字母。将调用另一种方法来说明word_2200中的特定字母 此外,有些方法会比较两个词。例如,将调用一个方法来比较单词_80和单词_2200,并需要返回哪个字母更多。将调用另一个方法来比较单词_80和
哇!谢谢大家对我的问题做出如此迅速的回答。你所有的建议对我帮助很大。我正在仔细考虑您反馈中提供的所有选项 请原谅我的模糊;让我回答你们的问题:
A) 文本文件实际上是用英语写的书。在第二种语言中出现一个单词是罕见的,但并非不可能。我认为文本文件中非英语单词的百分比为.0001%
A) 我笑着看着我问题的措辞。是的,它确实像一个学校作业。但不,这不是家庭作业
A) 对。考虑到连词、冠词等,大概每五个左右的单词
A) 随机的和连续的。当然有可能一种方法会随机定位一个单词。同样有可能的是,一种方法会在单词_1和单词_120000之间依次查找匹配的单词。这引出了最后一个问题
A) 对
干杯 使用一个?这将为您提供最佳的查找速度 我会将它们存储在一个大的ArrayList中,然后担心(可能是不必要的)优化 由于天生懒惰,我不认为优化是个好主意,除非有明确的需求。否则,你只是在浪费本可以更好地用在其他地方的精力 事实上,如果您可以为字数设置一个上限,并且不需要任何花哨的列表操作,那么我会选择一个普通(本机)字符串对象数组,其中一个整数包含实际的数字。这可能比基于类的方法更快 这使您能够以最快的速度访问各个元素,同时仍然能够执行所有精彩的字符串操作 注意,我还没有针对ArrayList对本机数组进行基准测试。它们可能和本机数组一样快,所以如果您对我的能力不像我那样盲目相信,那么您应该自己检查一下:-)
如果它们的速度一样快(甚至很接近),那么增加的好处(例如可扩展性)可能足以证明它们的使用是合理的。如果您按顺序访问这些字符串,则LinkedList将是最佳选择
对于随机访问,ArrayList具有很好的内存使用率/访问速度。只是用一个非常简单的基准来证实pax的假设
public static void main(String[] args)
{
int size = 120000;
String[] arr = new String[size];
ArrayList al = new ArrayList(size);
for (int i = 0; i < size; i++)
{
String put = Integer.toHexString(i).toString();
// System.out.print(put + " ");
al.add(put);
arr[i] = put;
}
Random rand = new Random();
Date start = new Date();
for (int i = 0; i < 10000000; i++)
{
int get = rand.nextInt(size);
String fetch = arr[get];
}
Date end = new Date();
long diff = end.getTime() - start.getTime();
System.out.println("array access took " + diff + " ms");
start = new Date();
for (int i = 0; i < 10000000; i++)
{
int get = rand.nextInt(size);
String fetch = (String) al.get(get);
}
end = new Date();
diff = end.getTime() - start.getTime();
System.out.println("array list access took " + diff + " ms");
}
publicstaticvoidmain(字符串[]args)
{
int size=120000;
字符串[]arr=新字符串[大小];
ArrayList al=新的ArrayList(大小);
对于(int i=0;i
输出:阵列访问耗时578毫秒
阵列列表访问耗时907毫秒
运行它几次,实际时间似乎有所不同,但通常阵列访问速度在200到400毫秒之间,超过10000000次迭代。如果顺序重要,则使用ArrayList/Vector(因为您将其称为“Wordxxx”),如果顺序不重要,则使用HashTable/HashMap 我将把计算为什么要使用ArrayList vs.Vector或HashTable vs.HashMap的练习留给你,因为我怀疑这是你的家庭作业。检查Javadocs
您不会从Collections框架类中获得任何方法来帮助您,正如您在上面的示例中所要求的那样,因为它们都不执行字符串比较操作。除非你只是想按字母顺序排序,否则你应该使用集合框架中的一个树实现。我不明白为什么这么多人建议使用Arraylist,或者