2016-10-15 55 views
1

我有一個文件處理程序。比較字符串與大陣列的最快方法

其中我有一個方法,檢查文件名(字符串)與ArrayList的文件名。這個想法是,該程序不必處理已經在ArrayList中的文件。

我的問題是,ArrayList可以非常大(16,000元)和我周圍的相同數量的文件,通過迭代使對ArrayList每個文件的檢查是花費過多時間。我認爲這是因爲我使用.contains

是否有更高效(即更快)的方式來執行這些字符串到ArrayList與非常大的arrayLists比較,還是應該存儲在不同的數據結構?

我的代碼:

所有的
public class Iterator { 
    static ArrayList<String> myFiles = new ArrayList<String>(); 
    static String filename= "/Files/FilesLogged.txt"; 

    public static void main(String[] args) throws IOException, SAXException, TikaException, SQLException, ParseException, URISyntaxException, BackingStoreException {  
    BufferedReader reader = new BufferedReader(new InputStreamReader(ClassLoader.class.getResourceAsStream(filename)),2048); 
     String line = null; 

     while((line = reader.readLine()) != null) { 
      myFiles.add(line); 
     } 
      reader.close(); 
     } 

    public static void loopthrough(String folderName) throws IOException, SAXException, TikaException, SQLException, ParseException, URISyntaxException{ 
     System.out.println("This is the loopthrough folderName"+folderName); 
     File dir = new File(folderName); 
     File[] directoryListing = dir.listFiles();   

      if (directoryListing != null) {     
       for (File child : directoryListing) { 
        if(!myFiles.contains(child.getName())){ 

      System.out.println("THE FILE NAMES ARE"+child.getName().toString()); 

              } 
                } 
                  } 
+0

請正確格式化您的代碼。現在它是不可讀的。 –

+2

爲什麼不使用HashSet呢? –

+0

哈希集更快嗎? –

回答

4

您應該使用Set(HashSet或TreeSet)。

該數據結構允許您分別檢查時間O(1)或O(log n)中元素的存在。

ArrayList將值與每個元素進行比較,因此它是O(n)。

我會建議你使用HashSet。每個條目使用它的開銷約爲70字節。

+0

HashSet支持包含方法。所以我仍然可以使用這種方法並獲得更快的比較? –

+0

@SebastianZeki,是的。雖然該方法具有相同的名稱並檢查元素是否存儲,但它絕對是其他方式工作的,並且工作速度更快。 –

+0

好的,謝謝。那很棒。 –

1

首先,你應該使用的搜索算法。一個簡單的開始將是一個二進制搜索。這會給你一個從n減少lg(n)的處理時間。 (例如10步而不是1024);

如果ArrayList沒有經常改變,那麼您可以在任何時候使用另一個線程(如果您有信息或時間來執行此操作)來執行該搜索。並且在找到可以緩存的結果之後,如果ArrayList發生更改,則將刪除緩存