Структура данных, такая как Treemap с дублирующимися ключами и ключом потолка в Java

ОБНОВИТЬ

Multimap<Double, PowerHost> createHostListofAvailableMIPS()
{
        List<PowerHost> tempList = hosts;
        Multimap<Double, PowerHost> listOfAvailableMIPS = TreeMultimap.create(Ordering.natural(), Ordering.arbitrary());

        for (PowerHost p : tempList)
        {
            //build tree
            listOfAvailableMIPS.put(p.getAvailableMips(), p);
        }
        return listOfAvailableMIPS;
}


PowerHost getHost (Vm vm)
    {
        this.reqdMIPS = vm.getMips();
        Multimap<Double, PowerHost> sortedPHs = createHostListofAvailableMIPS();
        PowerHost selectedHost = null;                  
        //gets mips that are >= reqdMIPS ie best matches
        NavigableSet<Double> ns =  (NavigableSet<Double>) sortedPHs.keySet();
        Double x = ns.ceiling(reqdMIPS);

//other codes follow

}

Я заметил, что есть. в утверждении, что

Treemap.<Double, PowerHost>create().keySet().ceiling(K)

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

NavigableSet<Double> ns = (NavigableSet<Double>) sortedPHs.keySet()

возвращает только один элемент, а не набор двойников

Есть ли в Java встроенная структура, которая является комбинацией наборов функций из Treemap + multimap?

Что я хочу, так это в основном Treemap, который может поддерживать несколько / дубликатов ключей. Я знаю, что мультикарта (из гуавы) может сделать это, но я не могу использовать ключ потолка (K) на мультикарте.

Мой первоначальный план состоял в том, чтобы использовать TreeMultimap, а затем использовать keyset(). Ceiling (k), но eclipse продолжает отклонять утверждения:

Multimap <Double, someObject> myMM= TreeMultimap.create();  

Жалуется на "Связанное несоответствие", говоря, что someObject не является допустимой заменой

keyset(). потолок (k) жалуется, что метод потолка не определен в Set.

Помощь / Предложения будут высоко оценены.

1 ответ

Чтобы решить первую проблему, вам нужно использовать MultimapBuilder вместо TreeMultimap, TreeMultimap требует, чтобы ключи и значения были Comparable, С MultimapBuilder Вы можете смешать Comparable ключи с не Comparable значения и до сих пор сортируются keySet,

ListMultimap<Double, SomeObject> myMM =
    MultimapBuilder.treeKeys().arrayListValues().build();

Чтобы решить вторую проблему, вам нужно будет разыграть keySet к SortedSet, (Это задокументировано как безопасное при использовании MultimapBuilder.treeKeys. Это все еще не достаточно, чтобы получить вас ceiling Впрочем, так как доступно только на NavigableMap:(Вам придется использовать что-то вроде getFirst(tailSet(k), null),

Другие вопросы по тегам