将字符串与大型arrayList进行比较的最快方法

时间:2016-10-15 06:37:20

标签: java string arraylist

我有一个文件处理程序。

在其中我有一个方法,检查文件名(字符串)与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());

                                           }
                                                     }
                                                          }

2 个答案:

答案 0 :(得分:4)

您应该使用Set(HashSet或TreeSet)。

此数据结构允许您分别检查其中元素是否存在时间为O(1)或O(log n)。

ArrayList将值与每个元素进行比较,因此它是O(n)。

我建议你使用HashSet。每个条目使用它的开销约为70个字节。

答案 1 :(得分:1)

首先,您应该使用搜索算法。一个简单的开始是二元搜索。这将为您提供从n开始的lg(n)处理时间。 (例如,10步而不是1024步);

如果ArrayList不经常更改,您可以随时使用另一个线程进行搜索(如果您有信息或时间以前执行此操作)。在找到可以缓存它的结果后,如果ArrayList发生了更改,您将删除缓存