Guava: доступ к элементам в TreeMultiset через положение в расширенном наборе entrySet - PullRequest
1 голос
/ 03 декабря 2011

Существует ли эффективный способ получения n верхних записей из отсортированного мультимножества (TreeMultiset)?

Чтобы указать, что я имею в виду, я публикую свое неэффективное решение:

public SortedMultiset<DataTuple> headMultiset(int upperBound, BoundType boundType){
    int i=0;
    DataTuple act= this.coreData.firstEntry().getElement();
    Iterator<DataTuple> itr = this.coreData.iterator();
    while(i<=upperBound){
        act = itr.next();
        i+=this.coreData.count(act);
    }
    return headMultiset(act, boundType);
}

В этом примере DataSet можно рассматривать как Object, а this.coreData является нижележащим TreeMultiset.

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

Ответы [ 2 ]

1 голос
/ 03 декабря 2011

Я не уверен на 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);
}
0 голосов
/ 03 декабря 2011

На самом деле решение с HashMap, похоже, имеет приемлемую производительность.Я построил хэш-карту с помощью:

public NavigableMap<Integer, E> BuildHashMap (SortedMultiset<E> multiset){
    NavigableMap<Integer, E>  ret = new TreeMap<Integer, E>();
    int n = 0;
    for (Entry<E> e : multiset.entrySet()) {
        ret.put(n, e.getElement());
        n += e.getCount();
    }
    return ret;
}

и получил к ней доступ с помощью .floorEntry(n).getValue().

Однако elementSet().asList() - это функция, которую я на самом деле ищу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...