Структура данных, такая как 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)
,