2011-11-07 35 views
9

Làm cách nào để thêm các phần tử từ hai bộ?Thêm các phần tử từ hai Bộ

If there's a set one (1, 3, 6, 8) 
And a set two (2, 4, 6, 8) 

Làm cách nào để các yếu tố từ hai yếu tố này lại với nhau?

Output should be (1, 2, 3, 4, 6, 8) 

Đây là những gì tôi đã cố gắng:

Set<Integer> one = new HashSet(); 
one.add(1); 
one.add(3); 
// and so on 
Set<Integer> two = new HashSet(); 
two.add(2); 
two.add(4); 
// and so on 
Set<Integer> newSet = new HashSet(); 
newSet.add(one); 
newSet.add(two); 

return newSet; 

Và điều này không làm việc, như phương thức add chỉ hoạt động đối với một số nguyên duy nhất, không phải là một tập hợp các số nguyên. Có một phương pháp mà tôi có thể thêm hai bộ với nhau?

Tôi cũng phải trả lại bộ này. Làm thế nào để làm điều đó?

+2

thử sử dụng addAll thay vì thêm –

Trả lời

29

Sử dụng Set.addAll()

Set<Integer> one = new HashSet<Integer>(); 
Set<Integer> two = new HashSet<Integer>(); 
Set<Integer> newSet = new HashSet<Integer>(one); 
newSet.addAll(two); 

Ngoài ra, bạn nên gõ nhà thầu của bạn (như trên).

Để làm điều này thành một phương pháp, hãy thử này:

public static Set<Integer> addTwoSets(Set<Integer> one, Set<Integer> two) { 
    Set<Integer> newSet = new HashSet<Integer>(one); 
    newSet.addAll(two); 
    return newSet; 
} 

Trong thực tế, chúng ta hãy đi hoàn toàn vớ vẩn ... đây là một phương pháp mà sẽ mất bất kỳ số lượng các bộ sưu tập của bất kỳ loại kéo dài loại mong muốn, và kết hợp chúng thành một bộ:

public static <T> Set<T> merge(Collection<? extends T>... collections) { 
    Set<T> newSet = new HashSet<T>(); 
    for (Collection<? extends T> collection : collections) 
     newSet.addAll(collection); 
    return newSet; 
} 
2

Bạn không muốn một Tập hợp. Như bạn đã phát hiện, chúng không có các phần tử trùng lặp, theo định nghĩa. Bạn đang tìm kiếm Đa số (trên thực tế, một SortedMultiset theo giao diện của nó), còn được gọi là Bag. Java không có một trong số đó, nhưng có sẵn các triển khai nguồn mở, ví dụ: Google's.

EDIT: Ngoài ra, bạn muốn thực hiện setOne.addAll(setTwo), không phải là một phần tử tại một thời điểm, như đã nhận xét ở trên, nhưng đó là vấn đề phụ.

+0

, thật ra tôi muốn xóa các mục trùng lặp sau này. –

+0

Ummm, đó chắc chắn KHÔNG phải những gì bạn đã hỏi ban đầu, vì đầu ra mẫu của bạn có bản sao. –

+0

Sự khác nhau giữa túi * và danh sách * là gì? – Gabe

0

Hoặc luân phiên sử dụng một ArrayList được sắp xếp:

ArrayList<Integer> list = new ArrayList<Integer>(one); 
list.addAll(two); 
Collections.sort(list); 
+0

Điều này sẽ không loại bỏ trùng lặp. – rakeeee

0

Như Bohemian mentioned, câu trả lời hay nhất là sử dụng Set.addAll(). Chỉ cần ghi nhớ rằng, nếu bạn không nhớ ghi đè một trong các bộ của bạn, nó hiệu quả hơn (ít nhất là từ quan điểm thời gian của nhà phát triển: P) để thêm một bộ trực tiếp vào bộ khác:

one.addAll(two); 
Các vấn đề liên quan