2016-10-15 4 views
1

파일 처리 프로그램이 있습니다.문자열을 큰 arrayList와 비교하는 가장 빠른 방법

파일 이름 (문자열)을 파일 이름의 ArrayList에 대조하는 방법이 있습니다. 아이디어는 프로그램이 이미 ArrayList에있는 파일을 처리 할 필요가 없다는 것입니다.

내가 가지고있는 문제는 ArrayList이 매우 커서 (16,000 개의 요소가 될 수 있음) 모든 파일을 동일한 번호로 반복하여 각 파일을 ArrayList에 대해 검사하는 데 너무 많은 시간이 걸린다는 것입니다. 나는 .contains을 사용하고 있기 때문에 이것이라고 생각합니다.

이 문자열을 매우 큰 arrayLists와 비교할 때 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

코드를 올바르게 포맷하십시오. 지금은 읽을 수 없습니다. –

+2

대신 HashSet을 사용하지 않는 이유는 무엇입니까? –

+0

해시셋이 빠릅니까? –

답변

4

Set (HashSet 또는 TreeSet)를 사용해야합니다.

이 데이터 구조를 사용하면 시간 O (1) 또는 O (log n) 동안 요소의 존재 여부를 확인할 수 있습니다.

ArrayList는 값을 각 요소와 비교하므로 O (n)입니다.

HashSet을 사용하는 것이 좋습니다. 이를 사용하기위한 오버 헤드는 각 항목에 대해 약 70 바이트입니다.

+0

HashSet은 contains 메서드를 지원합니다. 그래서이 방법을 사용하고 더 빠른 비교를 할 수 있습니까? –

+0

@SebastianZeki, 예. 이 메소드는 이름이 같고 요소가 저장되어 있는지 확인하지만 절대적으로 다른 방식으로 작동하며 훨씬 빠르게 작동합니다. –

+0

좋습니다, 감사합니다. Thats 위대한. –

1

먼저 당신은 검색 알고리즘을 사용한다. 간단한 시작은 2 진 검색입니다. 이것은 n에서 처리 시간을 lg (n) 줄 것입니다. (1024 대신 예 10 단계);

ArrayList가 자주 변경되지 않으면 다른 스레드를 사용하여 언제든지 해당 검색을 수행 할 수 있습니다 (이전에 정보 또는 시간이있는 경우). 결과를 찾은 후에 캐시 할 수 있습니다. ArrayList가 변경된 경우 캐시를 삭제합니다.

관련 문제