Я не уверен на 100%, какой результат вы ищете.Давайте рассмотрим пример: скажем, мультимножество имеет содержимое [5 xa, 3 xb, 7 xc, 2 xd, 5 xe].(Как и в Multiset.toString (), я пишу «count x object» для представления количества экземпляров объекта.) Если я правильно понимаю проблему, если n равно 5, то вы хотите получить результат [5 xa], правильно?
(Также неясно, хотите ли вы, чтобы размер результирующего мультимножества был «округленным». Например: если бы n было 6 в вышеупомянутом мультимножестве, вы бы хотели [5 xa, 1 xb], [5xa], или [5 xa, 3 xb]?)
На данный момент я предполагаю, что вы хотите округлить, то есть вы ожидаете [5 xa, 3 xb].Тогда ваш ответ не так уж и далек, хотя я думаю, что он слегка ошибочен, как написано.Вот как бы я написал это:
public <E> SortedMultiset<E> takeElements(SortedMultiset<E> multiset, int n) {
if (n == 0) { return ImmutableSortedMultiset.of(); }
Iterator<Multiset.Entry<E>> iterator = multiset.entrySet().iterator();
E cutoff = null;
for (int count = 0; count < n && iterator.hasNext(); ) {
Multiset.Entry<E> entry = iterator.next();
count += entry.getCount();
cutoff = entry.getElement();
}
if (count < n) { return multiset; }
// cutoff is not null, since the loop must iterate at least once
return multiset.headMultiset(cutoff, BoundType.CLOSED);
}