2011-08-25 67 views
2

我有一組100個對象。 我怎樣才能從這個集合中獲得5個對象的子集?從java的結果集中獲取一個隨機子集

我做這個,但現在它只返回我一個對象

  int size = memberSet.size(); 
     Set<Member> randomSet = new HashSet<Member>(); 
      int item = new Random().nextInt(size); 
      int i = 0; 
      for(Member mbr : memberSet) 
      { 
       if (i == item){ 
        randomSet.add(mbr); 
      } 
       i = i + 1; 
      } 
+2

Dup? http://stackoverflow.com/questions/124671/picking-a-random-element-from-a-set – 2011-08-25 13:37:38

+3

請參閱http://stackoverflow.com/questions/136474/best-way-to-pick-a-random -subset-from-a-collection – NPE

+0

看起來像重複,但提供的鏈接將允許您只返回一個隨機對象。用戶可能想要一個返回一組N個對象的解決方案。但問題有點不清楚。 - > @aix是的,看起來像一個匹配:D –

回答

13
List<Member> list = new LinkedList<Member>(memberSet); 
Collections.shuffle(list); 
Set<Member> randomSet = new HashSet<Member>(list.subList(0, 5)); 

完整的示例:雖然@dacwe解決方案要好得多,我可以

public static void main(String... args) { 

    Set<Member> memberSet = new HashSet<Member>(); 
    for (int i = 0; i < 100; i++) 
     memberSet.add(new Member(i)); 

    List<Member> list = new LinkedList<Member>(memberSet); 
    Collections.shuffle(list); 
    Set<Member> randomSet = new HashSet<Member>(list.subList(0, 5)); 

    System.out.println(randomSet); 
} 

static class Member { 
    final int value; 
    public Member(int value) { 
     this.value = value; 
    } 
    @Override 
    public String toString() { 
     return "" + value; 
    } 
} 
+0

非常乾淨的解決方案 – Wivani

+0

謝謝,這正是我需要的。清晰簡單! –

+2

非常好。 < - 用於愚蠢的15char規則的填充 - > – Farmor

-1

對我自己沒有幫助,對笑話,只是說放一個for(int i = 0; i < 5; i ++)圍繞一切,並移出Set randomSet = new HashSet(); 外循環: