Создайте карту из целого числа в списки объектов:
Map<Integer, List<YourObject>> map
пройдитесь по вашему набору, а для объекта o
вы добавите его в соответствующий список объектов.
Затем вы просматриваете карту, раздел за разделом и выбираете (случайный, если хотите) элемент из списка.
Вот полный пример:
// Setup
Set<YourObject> objs = new HashSet<YourObject>();
// Partition #1
objs.add(new YourObject("O1", 1));
objs.add(new YourObject("O2", 1));
// Partition #2
objs.add(new YourObject("O3", 2));
objs.add(new YourObject("O4", 2));
objs.add(new YourObject("O5", 2));
// Partition #3
objs.add(new YourObject("O6", 3));
// Group by A-attribute
Map<Integer, List<YourObject>> map = new HashMap<Integer, List<YourObject>>();
for (YourObject o : objs) {
if (!map.containsKey(o.A))
map.put(o.A, new ArrayList<YourObject>());
map.get(o.A).add(o);
}
// Select representatives:
Random rnd = new Random();
for (List<YourObject> partition : map.values()) {
YourObject representative = partition.get(rnd.nextInt(partition.size()));
System.out.println(representative.id);
}
Вывод:
O2
O4
O6