减少执行时间在循环

问题描述:

我有一个这样的代码:减少执行时间在循环

RandomAccessFile raf = new RandomAccessFile(new File("C:\\Users\\AhmadMaleki\\IdeaProjects\\Hello world\\src\\kish\\file1"), "r"); 

for (int i = 1 ; i < 1025 ; i++) 
     { 
      for (int j = 0; j < raf.length() - 4 ; j++) 
      { 
       raf.seek(j); 
       byte[] b = new byte[5]; 
       raf.read(b); 

       if (new String (b).equals(wordcount[i])) 
       { 
        z[i]++; 
       } 
      } 
     } 

在该代码raf.length()= 26841039和执行时间为4100分钟。 是否有减少运行时间的解决方案?(例如多线程,并行,....)

+2

欢迎来到Stack Overflow。这个网站实际上应该是代码不起作用。你想要[代码评论](https://codereview.stackexchange.com/)。 – Michael

+0

这很可能是可以优化的。作为一个例子,我真的怀疑你需要读取1024次的文件。相反,您可能需要一次扫描一遍,构建一些结构来保存数据并对其进行操作。 – Thomas

+0

继续我怀疑你需要使用RandomAccessFile。连续阅读的速度更快。 –

对于开始切换循环,以便不读取同一文件1024次。

for (int j = 0; j < raf.length() - 4 ; j++){ 
    for (int i = 1 ; i < 1025 ; i++){ 
     // Do your things here ... 
    } 
} 

然后明智地选择您的输入流。

+0

完全不需要这个循环......只需要做我在评论中写的东西:把这些单词放在一个集合中,并像下面这样检查它:'if(words.contains(new String(b ))z [i] ++' – paranoidAndroid

+0

如果你删除了内部循环,就没有'i',通过使用'Map '(而不是一个集合)'你实际上可以这样做:'map.set (word,map.get(word)+ 1)'这是一个真正的改进,但也许并不那么明显 – minus

+0

为什么你需要'我'?他只是想检查词是否包含在字典中,所以我认为'HashSet'应该足够了,不是吗?我得到的循环的全部点只是检查字典中的所有单词 – paranoidAndroid