2014-10-01 62 views
7

Tôi có 2 tệp văn bản có dữ liệu. Tôi đang đọc các tệp này với BufferReader và đặt dữ liệu của một cột cho mỗi tệp trong một List<String>.Cách lấy các giá trị duy nhất trong Danh sách

Tôi có dữ liệu trùng lặp trong mỗi loại, nhưng tôi cần có dữ liệu duy nhất trong List đầu tiên để đối đầu với dữ liệu trùng lặp trong số List thứ hai.

Làm cách nào để có được các giá trị duy nhất từ ​​List?

+0

Không thêm các giá trị trùng lặp nếu Danh sách đã có 'chứa()' nó? –

Trả lời

7

Chuyển đổi ArrayList thành HashSet.

List<String> listWithDuplicates; // Your list containing duplicates 
Set<String> setWithUniqueValues = new HashSet<>(listWithDuplicates); 

Nếu vì lý do nào đó, bạn muốn chuyển đổi tập hợp trở lại danh sách sau đó, bạn có thể, nhưng rất có thể sẽ không cần.

List<String> listWithUniqueValues = new ArrayList<>(setWithUniqueValues); 
+0

Thnks rất nhiều cho bạn trả lời. –

0

tôi vừa nhận ra giải pháp có thể hữu ích cho người khác. đầu tiên sẽ được điền với các giá trị được sao chép từ BufferReader.

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

Để trích xuất các giá trị độc đáo i chỉ cần tạo một ArrayList mới như xuống:

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

    for(String s : first) { 
     if(!otherList.contains(s)) 
      otherList.add(s); 
    } 

Rất nhiều bài trên internet đều nói gán ArrayList của tôi đến một List, Set, HashTable hoặc TreeSet. Bất cứ ai có thể giải thích sự khác biệt trong lý thuyết và whitch một là sử dụng tu tốt nhất trong thực tế? thnks dành cho những người thời gian của bạn.

+0

Tài liệu Java API cung cấp tài liệu phức tạp cho từng lớp và giao diện bộ sưu tập. [Trang Wikipedia trên danh sách] (http://en.wikipedia.org/wiki/List_ (abstract_data_type)) cũng cung cấp tổng quan và liên kết đến các trang về các loại bộ sưu tập khác. –

13

Nó có thể được thực hiện một một dòng bằng cách sử dụng một trung gian Set:

List<String> list = new ArrayList<>(new HashSet<>(list)); 

Trong java 8, sử dụng distinct() trên một dòng:

List<String> list = list.stream().distinct().collect(Collectors.toList()); 

Ngoài ra, không sử dụng một danh sách tại tất cả các; chỉ cần sử dụng một Set (như HashSet) ngay từ đầu cho bộ sưu tập bạn chỉ muốn giữ các giá trị duy nhất.

+0

Tôi nghĩ bạn có nghĩa là: 'list.stream(). Distinct(). Collect (Collectors.toList());' – MoGa

+0

@MoGa Tôi còn trẻ, ngu ngốc và yêu. Ai có thể đổ lỗi cho tôi vì sự điên rồ như vậy? (cảm ơn - mã được sửa) – Bohemian

+0

lol mã của bạn thực sự chỉ cho tôi đúng hướng;) cổ vũ – MoGa

0

Trong Java 8:

 // List with duplicates 
    List<String> listAll = Arrays.asList("A", "A", "B", "C", "D", "D"); 

    // filter the distinct 
    List<String> distinctList = listAll.stream() 
        .distinct() 
        .collect(Collectors.toList()); 

    System.out.println(distinctList);// prints out: [A, B, C, D] 

này cũng sẽ làm việc với các đối tượng, nhưng có thể bạn sẽ phải thích ứng bằng phương pháp của bạn.

Các vấn đề liên quan