2013-06-02 15 views
20

Tôi đang cố gắng đọc từ hai tệp và lưu trữ chúng trong hai danh sách mảng riêng biệt. Các tệp bao gồm các từ hoặc là một mình trên một dòng hoặc nhiều từ được phân tách bằng dấu phẩy. tôi đọc từng tập tin với đoạn mã sau (không hoàn thành):Xóa tất cả các đối tượng trong danh sách mảng tồn tại trong một danh sách mảng khác

ArrayList<String> temp = new ArrayList<>(); 

FileInputStream fis; 
fis = new FileInputStream(fileName); 

Scanner scan = new Scanner(fis); 

while (scan.hasNextLine()) { 
    Scanner input = new Scanner(scan.nextLine()); 
    input.useDelimiter(","); 
    while (scan.hasNext()) { 
     String md5 = scan.next(); 
     temp.add(md5); 
    } 
} 
scan.close();  

return temp; 

bây giờ tôi cần phải đọc hai tác phẩm trong và loại bỏ tất cả các từ từ tập tin đầu tiên mà cũng tồn tại trong tập thứ hai (có một số từ ngữ trùng lặp trong các tệp). Tôi đã thử với các vòng lặp và những thứ khác như vậy, nhưng không có gì có hiệu quả nên mọi sự trợ giúp sẽ được đánh giá cao!

Câu hỏi thưởng: Tôi cũng cần phải tìm hiểu xem có bao nhiêu bản sao trong hai tệp - Tôi đã thực hiện việc này bằng cách thêm cả hai mảng vào một HashSet và sau đó trừ kích thước của tập hợp từ kích thước kết hợp của hai arraylists - đây có phải là giải pháp tốt hay nó có thể được thực hiện tốt hơn không?

+0

có thể trùng lặp của [Trừ một ArrayList từ ArrayList khác] (http://stackoverflow.com/questions/9933403/subtracting-one-arraylist-from-another-arraylist) –

Trả lời

28

Bạn có thể sử dụng phương pháp removeAll để loại bỏ các mục của một danh sách từ một danh sách khác.

Để có được các bản sao bạn có thể sử dụng phương pháp retainAll, mặc dù cách tiếp cận của bạn với các thiết lập cũng tốt (và có lẽ hiệu quả hơn)

+0

Cảm ơn! Tôi đã thử sử dụng removeAll như vậy: ArrayList file1 = readFile (fileName1); ArrayList file2 = readFile (fileName2); file1.removeAll (file2); trả lại tệp1; Bất kỳ ý tưởng nào tại sao tính năng này không hoạt động? – GeorgeWChubby

+0

Sự cố của bạn phải ở nơi khác. Hãy thử in nội dung của tệp1, tệp2 và tệp1 sau thao tác xóa để xem điều gì đang xảy ra. – Joni

+0

Vấn đề là thao tác removeAll làm cho toàn bộ thứ bị treo.Tôi để cho nó chạy trong 50 phút và không có gì xảy ra - tất cả mọi thứ tôi làm cho đến khi tôi gọi phương thức hoạt động tốt (và nếu tôi loại bỏ thao tác removeAll phương thức hoạt động tốt). Theo nghĩa đen, điều duy nhất không hoạt động là removeAll, điều làm tôi bối rối. – GeorgeWChubby

6

Cơ sở bộ sưu tập có một phương pháp thuận tiện cho mục đích này:

list1.removeAll(list2); 
2

Như những người khác đã đề cập, sử dụng phương pháp Collection.removeAll nếu bạn muốn xóa tất cả các yếu tố tồn tại trong một Bộ sưu tập từ Bộ sưu tập mà bạn đang gọi removeall vào.

Đối với câu hỏi thưởng của bạn, tôi là người hâm mộ lớn của lớp học Sets của Guava. Tôi sẽ đề nghị việc sử dụng Sets.intersection như sau:

Sets.intersection(wordSetFromFile1, wordSetFromFile2).size(); 

Giả sử bạn đã tạo ra một tập hợp từ từ cả hai tập tin, bạn có thể xác định có bao nhiêu từ biệt họ có điểm chung với một lót.

2

Trước tiên, bạn cần phải ghi đè phương pháp bình đẳng trong lớp tùy chỉnh của bạn và xác định các tiêu chí phù hợp với loại bỏ danh sách

public class CustomClass{ 

@Override 
    public boolean equals(Object obj) { 

     try { 
      CustomClass licenceDetail = (CustomClass) obj; 
      return name.equals(licenceDetail.getName()); 
     } 
     catch (Exception e) 
     { 
      return false; 
     } 

    } 
} 

Thứ hai, bạn gọi phương thức RemoveAll()

list1.removeAll (List2) ;

+1

Upvoting này vì nó là câu trả lời duy nhất mà đề cập một cách rõ ràng rằng phương thức equals cần phải được ghi đè trong các lớp có trong danh sách. Điều này có thể không hiển nhiên đối với một số người và removeAll sẽ không hoạt động như mong đợi nếu bằng không được triển khai chính xác cho các lớp tùy chỉnh của bạn. – ioss