簡體   English   中英

比較字符串和大數組的最快方法

[英]Fastest way to compare string to a large arrayList

我有一個文件處理程序。

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

ArrayList的問題是ArrayList可能非常大(16,000個元素),並且我要遍歷大約相同數量的文件,因此針對ArrayList檢查每個文件花費了太多時間。 我認為這是因為我正在使用.contains

是否存在使用非常大的arrayList執行這些String與ArrayList比較的更有效(即更快)的方法,還是應該將其存儲在其他數據結構中?

我的代碼:

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());

                                           }
                                                     }
                                                          }

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

通過此數據結構,您可以分別在時間O(1)或O(log n)中檢查元素的存在。

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

我建議您使用HashSet。 每個條目使用它的開銷約為70個字節。

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

如果ArrayList更改的頻率不是很高,則可以隨時使用另一個線程進行搜索(如果您有足夠的信息或時間可以進行搜索)。 找到結果后,您可以緩存它,如果ArrayList更改,則將刪除緩存

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM