我有一个文件处理程序。
在其中我有一个方法,检查文件名(字符串)与ArrayList
文件名。这个想法是程序不必处理ArrayList
中的文件。
我遇到的问题是ArrayList
可能非常大(16,000个元素)而且我正在遍历相同数量的文件,以便针对ArrayList
检查每个文件太多时间。我想这是因为我正在使用.contains
。
是否有更高效(即更快)的方法来执行这些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());
}
}
}
答案 0 :(得分:4)
您应该使用Set(HashSet或TreeSet)。
此数据结构允许您分别检查其中元素是否存在时间为O(1)或O(log n)。
ArrayList将值与每个元素进行比较,因此它是O(n)。
我建议你使用HashSet。每个条目使用它的开销约为70个字节。
答案 1 :(得分:1)
首先,您应该使用搜索算法。一个简单的开始是二元搜索。这将为您提供从n开始的lg(n)处理时间。 (例如,10步而不是1024步);
如果ArrayList不经常更改,您可以随时使用另一个线程进行搜索(如果您有信息或时间以前执行此操作)。在找到可以缓存它的结果后,如果ArrayList发生了更改,您将删除缓存