Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串与大型arrayList进行比较的最快方法_Java_String_Arraylist - Fatal编程技术网

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,是的。虽然该方法具有相同的名称并检查元素是否被存储,但它在引擎盖下以完全相反的方式工作,工作速度更快。好的,谢谢。太好了。