Java 将字符串与大型arrayList进行比较的最快方法
我有一个文件处理程序 在其中,我有一个方法,可以根据文件名的Java 将字符串与大型arrayList进行比较的最快方法,java,string,arraylist,Java,String,Arraylist,我有一个文件处理程序 在其中,我有一个方法,可以根据文件名的ArrayList检查文件名(字符串)。其思想是程序不必处理ArrayList中已经存在的文件 我遇到的问题是,ArrayList可能非常大(16000个元素),并且我正在迭代大约相同数量的文件,因此根据ArrayList检查每个文件花费了太多时间。我想这是因为我使用的是.contains 是否有一种更有效(即更快)的方法来执行这些字符串到ArrayList与非常大的ArrayList的比较,或者我应该存储在不同的数据结构中 我的代码:
ArrayList
检查文件名(字符串)。其思想是程序不必处理ArrayList
中已经存在的文件
我遇到的问题是,ArrayList
可能非常大(16000个元素),并且我正在迭代大约相同数量的文件,因此根据ArrayList
检查每个文件花费了太多时间。我想这是因为我使用的是.contains
是否有一种更有效(即更快)的方法来执行这些字符串到ArrayList
与非常大的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());
}
}
}
公共类迭代器{
静态ArrayList myFiles=新建ArrayList();
静态字符串filename=“/Files/filesloged.txt”;
publicstaticvoidmain(String[]args)抛出IOException、SAXException、TikaException、SQLException、ParseException、URISyntaxException、BackingStoreException{
BufferedReader=new BufferedReader(new InputStreamReader(ClassLoader.class.getResourceAsStream(filename)),2048);
字符串行=null;
而((line=reader.readLine())!=null){
添加(行);
}
reader.close();
}
publicstaticvoidloopthrough(stringfoldername)抛出IOException、SAXException、TikaException、SQLException、ParseException、URISyntaxException{
System.out.println(“这是loopthrough folderName”+folderName);
文件目录=新文件(文件夹名称);
File[]directoryListing=dir.listFiles();
如果(directoryListing!=null){
用于(文件子项:目录列表){
如果(!myFiles.contains(child.getName())){
System.out.println(“文件名为”+child.getName().toString());
}
}
}
首先,你应该使用一个搜索算法。一个简单的开始是二进制搜索。这将使你的处理时间从n减少到lg(n)(例如10步而不是1024步)
如果ArrayList不经常更改,您可以随时使用另一个线程进行搜索(如果您以前有信息或时间这样做的话)。找到结果后,您可以将其缓存,如果ArrayList发生更改,您将删除缓存。首先,您应该使用搜索算法。一个简单的开始是二进制搜索。这将使您的处理时间从n减少到lg(n)(例如,10步而不是1024步) 如果ArrayList不经常更改,您可以随时使用另一个线程进行搜索(如果您以前有信息或时间进行搜索)。找到结果后,您可以缓存它,如果ArrayList更改,您将删除缓存。您应该使用Set(HashSet或TreeSet) 此数据结构允许您分别检查时间O(1)或O(logn)中元素的存在性 ArrayList将值与每个元素进行比较,因此它是O(n) 我建议您使用HashSet。使用它的开销大约是每个条目约70字节。您应该使用Set(HashSet或TreeSet) 此数据结构允许您分别检查时间O(1)或O(logn)中元素的存在性 ArrayList将值与每个元素进行比较,因此它是O(n)
我建议您使用哈希集。使用哈希集的开销约为每个条目约70字节。请正确设置代码格式。现在它不可读。为什么不使用哈希集?哈希集更快吗?请正确设置代码格式。现在它不可读。为什么不使用哈希集?哈希集更快吗?哈希集支持tains方法。所以我仍然可以使用此方法并获得更快的比较?@SebastianZeki,是的。虽然此方法具有相同的名称并检查元素是否存储,但它以完全不同的方式在引擎盖下工作,并且工作速度更快。好的,谢谢。太好了。HashSet支持contains方法。因此我仍然可以使用此方法并获得更快的comparisons?@SebastianZeki,是的。虽然该方法具有相同的名称并检查元素是否被存储,但它在引擎盖下以完全相反的方式工作,工作速度更快。好的,谢谢。太好了。