Как выбрать уникальных представителей из разделов Java HashSet - PullRequest
1 голос
/ 27 марта 2012

Я хотел бы знать способ реализации сценария, который я пытаюсь сделать.

У меня есть HashSet объектов с Object, имеющим атрибут A типа int.Теперь я хочу представителя от каждого из отдельных разделов HashSet на основе различных значений атрибута A.

Например: Пусть HashSet будет

{O1, O2, O3, O4, O5, O6} where O1 to O6 are objects with attribute values as follows

Partition #1
O1.A = 1
O2.A = 1
Partition #2
O3.A = 2
O4.A = 2
O5.A = 2
Partition #3
O6.A = 3

Я хочу представителяиз каждого раздела

e.g. {O1, O4, O6} 

Кто-нибудь может предложить какой-нибудь способ сделать это?Любая помощь будет оценена.

Спасибо,

Сомнатх

Ответы [ 4 ]

1 голос
/ 27 марта 2012
HashSet<MyObject> inputSet; // Assuming inputSet is already initiliazed ... just put it here for clarity
HashSet<Integer> auxSet = new HashSet<Integer>();
List<MyObject> result = new ArrayList<MyObject>();

for (MyObject o : inputSet) {
   if (!auxSet.contains(o.getA()) {
       auxSet.add(o.getA());
       result.add(o);
   }
}

// Теперь результат содержит ваших представителей

1 голос
/ 27 марта 2012

Создайте Map<Integer, YourClass> (вероятно, лучше всего TreeMap, чтобы разделы были в порядке) и скопируйте в него данные:

 Map<Integer, YourClass> partitions = new TreeMap<Integer, YourClass>();
 for (YourClass x: set){
    Integer p = x.getA();
    if (partitions.containsKey(p))
       continue;
    partitions.put(p, x);
 }

После этого partitions содержит одну запись для каждого разделанайдено с одним представителем (первый найден).

Set<YourClass> representatives = partitions.values();
1 голос
/ 27 марта 2012

Я рекомендую вам получить все результаты и сохранить их в HashMap. Поскольку его ключи уникальны, вы можете получить значения оттуда.

1 голос
/ 27 марта 2012

Создайте карту из целого числа в списки объектов:

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
...