[英]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.