8

I have a set of 100 object. How can i get a subset of 5 objects from this set ?

I'm doing this for now but it only returns me one object

          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;
            }
Kévin_Bransard
  • 676
  • 2
  • 11
  • 23
  • 2
    Dup? http://stackoverflow.com/questions/124671/picking-a-random-element-from-a-set –  Aug 25 '11 at 13:37
  • 3
    see http://stackoverflow.com/questions/136474/best-way-to-pick-a-random-subset-from-a-collection – NPE Aug 25 '11 at 13:38
  • Seems like a duplicate but the provided link will allow you to return only one random object. User could want a solution that returns a set of N objects. But the question is a bit unclear. -> @aix yes that looks like a match :D – Johann du Toit Aug 25 '11 at 13:40
  • 1
    Sorry for my english, but yes, I want to get more than one item in my random subset and none of the questions you link me answers my question. – Kévin_Bransard Aug 25 '11 at 13:47

1 Answers1

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

Full example:

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;
    }
}
dacwe
  • 43,066
  • 12
  • 116
  • 140
  • Thanks, that's exactly what I needed. Clear and simple ! – Kévin_Bransard Aug 25 '11 at 14:15
  • 4
    Just a small detail: it would be more efficient to use `ArrayList` instead of `LinkedList`. Shuffling a `LinkedList` will force Java to create a temporary array, shuffle it, and put things back in the `LinkedList`. While with `ArrayList`, it would be done in place. – Helder Pereira Jul 21 '17 at 06:37