Мне нужно найти самый эффективный способ найти случайный элемент из самой популярной категории
Из
4 Cheese
1 Olive
2 Mushroom
4 Ham
2 Chicken
4 Salad
Я хочу либо Cheese
, либо Ham
, либо * 1008.*.Если есть несколько верхних категорий, мне все равно, из какой категории я получу свой товар.
На входе у меня есть Iterator<Foo>
, где Foo
реализует
Interface Foo {
int getCategory();
}
Мой текущийкод выглядит так:
Foo getItem(Iterator<Foo> it) {
Map<Integer, List<Foo>> categoryMap = new HashMap<Integer, List<Foo>>();
while(it.hasNext()) {
Foo foo = it.next();
int category = foo.getCategory();
List<Foo> l = categoryMap.get(category);
if(l == null) {
l = new ArrayList<Foo>();
categoryMap.put(category, l);
}
l.add(foo);
}
int longest_list_size = 0;
int longest_category_id = -1;
Set<Integer> categories = categoryMap.keySet()
for(Integer c: categories ) {
int list_size = categoryMap.get(c).size();
if(list_size > longest_list_size) {
longest_list_size = list_size;
longest_category_id = c;
}
}
if(longest_list_size == 0)
return null;
int r = new Random().nextInt(longest_list_size);
return categoryMap.get(c).get(r);
}