Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中存储和访问120000个单词的最佳方法_Java_Storage - Fatal编程技术网

在java中存储和访问120000个单词的最佳方法

在java中存储和访问120000个单词的最佳方法,java,storage,Java,Storage,我正在编写一个严格读取文本文件(.txt)的java应用程序。这些文件最多可包含120000个字 应用程序需要存储所有+120000个字。它需要将它们命名为word_1、word_2等,还需要访问这些单词以对它们执行各种方法 这些方法都与字符串有关。例如,将调用一个方法来说明word_80中有多少个字母。将调用另一种方法来说明word_2200中的特定字母 此外,有些方法会比较两个词。例如,将调用一个方法来比较单词_80和单词_2200,并需要返回哪个字母更多。将调用另一个方法来比较单词_80和

我正在编写一个严格读取文本文件(.txt)的java应用程序。这些文件最多可包含120000个字

应用程序需要存储所有+120000个字。它需要将它们命名为word_1、word_2等,还需要访问这些单词以对它们执行各种方法

这些方法都与字符串有关。例如,将调用一个方法来说明word_80中有多少个字母。将调用另一种方法来说明word_2200中的特定字母

此外,有些方法会比较两个词。例如,将调用一个方法来比较单词_80和单词_2200,并需要返回哪个字母更多。将调用另一个方法来比较单词_80和单词_2200,并需要返回两个单词共享的特定字母

我的问题是:因为我几乎只处理字符串,所以最好将这些单词存储在一个大的ArrayList中吗?几个小数组列表?或者我应该使用许多其他存储方法中的一种,比如向量、哈希集、链接列表

我主要关心的两个问题是1.)访问速度,和2.)拥有尽可能多的预构建方法供我使用

提前感谢您的帮助


哇!谢谢大家对我的问题做出如此迅速的回答。你所有的建议对我帮助很大。我正在仔细考虑您反馈中提供的所有选项

请原谅我的模糊;让我回答你们的问题:

  • Q) 英语?
    A) 文本文件实际上是用英语写的书。在第二种语言中出现一个单词是罕见的,但并非不可能。我认为文本文件中非英语单词的百分比为.0001%

  • Q) 家庭作业?
    A) 我笑着看着我问题的措辞。是的,它确实像一个学校作业。但不,这不是家庭作业

  • Q) 复制品?
    A) 对。考虑到连词、冠词等,大概每五个左右的单词

  • Q) 访问权限?
    A) 随机的和连续的。当然有可能一种方法会随机定位一个单词。同样有可能的是,一种方法会在单词_1和单词_120000之间依次查找匹配的单词。这引出了最后一个问题

  • Q) 迭代整个列表?
    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,或者