2012-04-29 91 views
0

我正在創建應用程序來檢查我SD卡中的重複文件。
我在「文件」ArrayList中獲得整個文件列表。
現在我需要找到重複的文件,所以我在線程中使用了這段代碼。
但它的工作,但它需要太多的時間來找到重複。線程需要很長時間。爲什麼?

for(int i=0;i<files.size();i++) 
    { 
     for(int j=i+1;j<files.size();j++) 
     { 
     if(new File(files.get(i)).getName().compareTo(new File(files.get(j)).getName())==0) 
     { 
      //My Code 
     } 

    } 
} 
+4

嗯,這是O(N^2),並且您分配N^2次相同的對象,所以難怪它的速度慢。 – 2012-04-29 07:47:47

+0

使用HashSet來檢查重複項。 – assylias 2012-04-29 07:50:01

+0

另外,Android可能實際上訪問文件系統,這會讓一切變得更慢。 – 2012-04-29 07:51:56

回答

2

您可以考慮增加所有元素的HashSet並加入他們回到ArrayList。像

Set<File> set = new HashSet<File>(); 
set.addAll(files); 
files.clear(); 
files.addAll(set); 

現在的東西,如果你比較setfiles大小,你知道,如果你有重複或不

編輯
改變HashSetSet<File>的建議

+2

這是一個很好的做法,使用泛型和接口:'設置 set = new HashSet ();' – assylias 2012-04-29 07:52:10

+1

假設你有手機上的內存使用哈希集,這是最好的解決方案。否則,請使用nlog(n)排序算法,然後執行線性掃描以刪除重複項。 – JustinDanielson 2012-04-29 07:56:17

0

其實,創建一個線程是相當昂貴的,結賬Painless Threading

如果您經常創建相同的線程--AsyncTask可能是一個不錯的選擇,因爲它會以一種好的方式爲您管理線程創建/停止。

下面是呈現代碼一些調整:

  • 緩存files.size()一次,它存儲在一個變量,並使用它;不需要
  • new File(files.get(i)).getName()被要求每次J的,可以被緩存;
  • 儘量避免在循環內調用new。我不確定你爲什麼需要撥打​​而不是僅僅比較files.get()的結果;