2012-10-18 41 views
18

Tôi có một số LinkedHashSet, tức là tập hợp đơn đặt hàng. Tôi đang cố gắng tìm một hàm để chỉ trả lại tập hợp con của tập hợp, nghĩa là 20 phần tử đầu tiên của tập hợp. Tôi biết tôi có thể làm điều đó bằng cách tạo ra một bộ mới và sau đó populating bằng cách sử dụng một iteration của bộ đầu tiên nhưng tôi đã hy vọng cho một cái gì đó ngắn gọn hơn.Tạo tập con của Tập hợp trong Java

Ngoài ra, hãy xem thư viện ổi của Google, nhưng không thể thấy những gì tôi muốn.

+0

Nếu bạn có thể sử dụng 'SortedSet' thì bạn đã có một phương pháp để đưa nhóm ra khỏi nó .. –

+0

SortedSet là không tốt như đặt tự nhiên của họ không phải là những gì tôi muốn tôi muốn thứ tự chèn của họ đặt hàng –

Trả lời

29

Trong ổi:

Set<Integer> subset = ImmutableSet.copyOf(Iterables.limit(set, 20)); 

Lưu ý rằng Iterables.limit() được đánh giá một cách lười biếng, vì vậy chỉ có một bộ sưu tập thêm được tạo ra.

+0

Cảm ơn tôi đã có một mực in sẽ có một cách để làm điều này trong ổi. –

+9

nếu tôi muốn nhận được từ chỉ mục 20-40 thì sao? – Dejell

4

Bạn có thể sử dụng lúc đầu tiên là SortedSet vì phương pháp subSet tồn tại trên đó.

Bạn cũng có thể thêm nội dung của bộ của mình vào List và sử dụng phương pháp subList trên đó. Nhưng nó phụ thuộc vào lượng dữ liệu được lưu trữ trong Set của bạn vì bạn không muốn sao chép một lượng lớn dữ liệu.

Nếu không, bạn nên ở lại với quá trình lặp qua Tập hợp vì nó sẽ hiệu quả hơn.

15

Bạn có thể làm điều này:

Set<Integer> set = new LinkedHashSet<>(); 
for (int i = 0; i < 50; i++) { 
    set.add(i); 
} 

List<Integer> list = new ArrayList<>(set); 
Set<Integer> subSet = new LinkedHashSet<>(list.subList(0, 20)); 
+4

+1 cho ra khỏi suy nghĩ của hộp. :) –

+0

THanks trông gọn gàng, ngoại trừ thực tế bạn phải tạo cả Set và ArrayList khác nhưng tôi có thể sống với điều đó. –

+0

Bất kỳ lý do cụ thể nào cho downvote? – Reimeus

1

phương pháp helper Simple (Bạn có thể sử dụng nó cho Set hoặc bất kỳ bộ sưu tập khác):

public static <T> List<T> listOf(final Collection<T> set, final int limit) { 
    final List<T> list = new ArrayList<>(limit); 

    final Iterator<T> i = set.iterator(); 
    for (int j = 0; j < limit && i.hasNext(); j++) { 
     list.add(i.next()); 
    } 

    return list; 
} 
7

Một giải pháp sử dụng con suối và nhà sưu tập từ Java 8:

Set<Integer> subSet = set.stream() 
    .limit(20) 
    .collect(toCollection(LinkedHashSet::new)); 
    // You could also collect to something else 
    // with another collector like this: 
    // .collect(toList()); 

này giả import static java.util.stream.Collectors.toCollection;.

+0

Bạn có nghĩa là giới hạn() không bỏ qua() tôi nghĩ vậy. – dnellis74

+1

@ dnellis74: Ah, tất nhiên, cảm ơn, đã cập nhật. – Lii

2

Trong Java 8 bạn có thể làm

youSet.stream() 
    .skip(start) // the offset 
    .limit(count) // how many items you want 
    .collect(Collectors.toSet()); 
Các vấn đề liên quan