2010-05-04 62 views
74

Tôi có hai danh sách (không phải danh sách java, bạn có thể nói hai cột)Java So sánh Hai Lists

Ví dụ

**List 1**   **Lists 2** 
    milan     hafil 
    dingo     iga 
    iga     dingo 
    elpha     binga 
    hafil     mike 
    meat     dingo 
    milan 
    elpha 
    meat 
    iga     
    neeta.peeta  

Tôi muốn một phương thức trả về có bao nhiêu yếu tố này là giống nhau. Đối với ví dụ này, nó phải là 3 và nó sẽ trả lại cho tôi các giá trị tương tự của cả danh sách và các giá trị khác nhau.

Tôi có nên sử dụng hashmap nếu có thì phương pháp nào để nhận kết quả của tôi?

Xin giúp

PS: Nó không phải là một trường chuyển nhượng :) Vì vậy, nếu bạn chỉ cần hướng dẫn cho tôi nó sẽ đủ

+0

Xin gợi ý cho bất kỳ cấu trúc dữ liệu trong danh sách không phải là danh sách java hoặc hashmap hoặc bất kỳ cấu trúc dữ liệu – user238384

+1

Hãy chắc chắn để suy nghĩ về những gì bạn nên làm gì trong trường hợp ngoại lệ. Danh sách có thể chứa cùng một giá trị hai lần không? Nếu vậy, nếu "dingo" nằm trong cả hai danh sách hai lần, thì điều đó có được tính là hai phần tử chung hay chỉ một? – JavadocMD

+0

Bạn có thể sửa đổi một trong các Danh sách không? –

Trả lời

143

EDIT

Dưới đây là hai phiên bản. Một sử dụng ArrayList và khác sử dụng HashSet

Hãy so sánh chúng và tạo phiên bản riêng của bạn từ này, cho đến khi bạn có được những gì bạn cần.

này nên là đủ để trang trải các:

PS: Nó không phải là một trường chuyển nhượng :) Vì vậy, nếu bạn chỉ cần hướng dẫn cho tôi nó sẽ đủ

một phần của câu hỏi của bạn .

tiếp tục với câu trả lời ban đầu:

Bạn có thể sử dụng một java.util.Collection và/hoặc java.util.ArrayList cho điều đó.

Phương pháp retainAll nào sau đây:

chỉ giữ lại các yếu tố trong bộ sưu tập này được chứa trong bộ sưu tập quy định

xem mẫu này:

import java.util.Collection; 
import java.util.ArrayList; 
import java.util.Arrays; 

public class Repeated { 
    public static void main(String [] args) { 
     Collection listOne = new ArrayList(Arrays.asList("milan","dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta")); 
     Collection listTwo = new ArrayList(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); 

     listOne.retainAll(listTwo); 
     System.out.println(listOne); 
    } 
} 

EDIT

Đối với phần thứ hai (giá trị tương tự), bạn có thể sử dụng các phương pháp removeAll:

Loại bỏ tất cả các yếu tố của bộ sưu tập này cũng được chứa trong bộ sưu tập xác định.

Phiên bản thứ hai này cung cấp cho bạn các giá trị và xử lý tương tự lặp lại (bằng cách loại bỏ chúng).

Lần này Collection có thể là một Set thay vì một List (giá trị chênh lệch là, Set không cho phép lặp lại)

import java.util.Collection; 
import java.util.HashSet; 
import java.util.Arrays; 

class Repeated { 
     public static void main(String [] args) { 

      Collection<String> listOne = Arrays.asList("milan","iga", 
                "dingo","iga", 
                "elpha","iga", 
                "hafil","iga", 
                "meat","iga", 
                "neeta.peeta","iga"); 

      Collection<String> listTwo = Arrays.asList("hafil", 
                "iga", 
                "binga", 
                "mike", 
                "dingo","dingo","dingo"); 

      Collection<String> similar = new HashSet<String>(listOne); 
      Collection<String> different = new HashSet<String>(); 
      different.addAll(listOne); 
      different.addAll(listTwo); 

      similar.retainAll(listTwo); 
      different.removeAll(similar); 

      System.out.printf("One:%s%nTwo:%s%nSimilar:%s%nDifferent:%s%n", listOne, listTwo, similar, different); 
     } 
} 

Output:

$ java Repeated 
One:[milan, iga, dingo, iga, elpha, iga, hafil, iga, meat, iga, neeta.peeta, iga] 

Two:[hafil, iga, binga, mike, dingo, dingo, dingo] 

Similar:[dingo, iga, hafil] 

Different:[mike, binga, milan, meat, elpha, neeta.peeta] 

Nếu nó doesn' t làm chính xác những gì bạn cần, nó mang lại cho bạn một khởi đầu tốt để bạn có thể xử lý từ đây.

Câu hỏi dành cho người đọc: Bạn sẽ bao gồm tất cả các giá trị lặp lại như thế nào?

+0

@Oscar, Suy nghĩ chính xác của tôi, nhưng tôi không chắc liệu chúng tôi có thể sửa đổi nội dung của 'listOne' hay không, nhưng +1 anyways! –

+0

Bạn không nên sử dụng các loại thô. – polygenelubricants

+0

@poygenelubricants bạn có ý nghĩa gì bởi * loại thô * chứ không phải generics? Tại sao không? – OscarRyz

1

Giả sử hash1hash2

List<String> sames = whatever 
List<String> diffs = whatever 

int count = 0; 
for(String key : hash1.keySet()) 
{ 
    if(hash2.containsKey(key)) 
    { 
     sames.add(key); 
    } 
    else 
    { 
     diffs.add(key); 
    } 
} 

//sames.size() contains the number of similar elements. 
+0

Anh ta muốn danh sách các phím giống nhau, không bao nhiêu khóa giống hệt nhau. Tôi nghĩ. –

+0

Cảm ơn stefan đã giúp bạn. Vâng Rosdi là chính xác và bạn là tốt. Tôi cần tổng số giá trị tương tự và các giá trị tương tự. – user238384

8

Là những thực sự lists (được đặt hàng, với các bản sao), hoặc là họ sets (không có thứ tự, không trùng lặp)?

Bởi vì nếu đó là sau này, sau đó bạn có thể sử dụng, giả sử, java.util.HashSet<E> và thực hiện việc này trong thời gian tuyến tính mong muốn bằng cách sử dụng số retainAll thuận tiện.

List<String> list1 = Arrays.asList(
     "milan", "milan", "iga", "dingo", "milan" 
    ); 
    List<String> list2 = Arrays.asList(
     "hafil", "milan", "dingo", "meat" 
    ); 

    // intersection as set 
    Set<String> intersect = new HashSet<String>(list1); 
    intersect.retainAll(list2); 
    System.out.println(intersect.size()); // prints "2" 
    System.out.println(intersect); // prints "[milan, dingo]" 

    // intersection/union as list 
    List<String> intersectList = new ArrayList<String>(); 
    intersectList.addAll(list1); 
    intersectList.addAll(list2); 
    intersectList.retainAll(intersect); 
    System.out.println(intersectList); 
    // prints "[milan, milan, dingo, milan, milan, dingo]" 

    // original lists are structurally unmodified 
    System.out.println(list1); // prints "[milan, milan, iga, dingo, milan]" 
    System.out.println(list2); // prints "[hafil, milan, dingo, meat]" 
+0

Tôi cũng thực sự không biết cấu trúc dữ liệu nào. Nó có bản sao. Bây giờ bạn có thể xem câu hỏi được cập nhật – user238384

+0

Liệu nó có xóa các giá trị lặp lại khỏi tập dữ liệu không? Tôi không muốn mất bất kỳ giá trị nào: ( – user238384

+0

@agazerboy: Tôi đã cố gắng giải quyết cả hai câu hỏi. Vui lòng yêu cầu làm rõ thêm. – polygenelubricants

27

Bạn có thể thử các phương thức intersection()subtract() từ CollectionUtils.

intersection() phương pháp cung cấp cho bạn bộ sưu tập có chứa các phần tử phổ biến và phương pháp subtract() cung cấp cho bạn tất cả những thứ không phổ biến.

Họ cũng nên chăm sóc của các yếu tố tương tự

+0

Điều này làm việc hoàn hảo cho tôi. Dễ dàng hơn nhiều mã. – Zeus

1

Tôi tìm thấy một ví dụ rất cơ bản của Danh sách so sánh tại List Compare dụ này xác nhận kích thước đầu tiên và sau đó kiểm tra sự sẵn có của các yếu tố đặc thù của một danh sách trong một.

3

Sử dụng java 8 removeIf

public int getSimilarItems(){ 
    List<String> one = Arrays.asList("milan", "dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta"); 
    List<String> two = new ArrayList<>(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); //Cannot remove directly from array backed collection 
    int initial = two.size(); 

    two.removeIf(one::contains); 
    return initial - two.size(); 
} 
+0

Có vẻ tốt, nhưng nếu tôi muốn giữ cho các danh sách chưa được sửa đổi, tôi sẽ phải sao chép một trong các danh sách và điều đó sẽ không được mong muốn trong một số trường hợp nhất định. – sebadagostino

-1
public static boolean compareList(List ls1, List ls2){ 
    return ls1.containsAll(ls2) && ls1.size() == ls2.size() ? true :false; 
    } 

public static void main(String[] args) { 

    ArrayList<String> one = new ArrayList<String>(); 
    one.add("one"); 
    one.add("two"); 
    one.add("six"); 

    ArrayList<String> two = new ArrayList<String>(); 
    two.add("one"); 
    two.add("six"); 
    two.add("two"); 

    System.out.println("Output1 :: " + compareList(one, two)); 

    two.add("ten"); 

    System.out.println("Output2 :: " + compareList(one, two)); 
    } 
+0

Giải pháp này trả về kết quả sai khi hai chứa 3 bản sao "một". Nó sẽ tạo ra một kết quả đúng. –