2017-04-20 129 views
-1

我有一個這樣的代碼:減少執行時間在循環

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。連續閱讀的速度更快。 –

回答

1

對於開始切換循環,以便不讀取同一文件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