Нужна отсортированная хэш-карта по значению, где значение постоянно меняется - PullRequest
0 голосов
/ 08 ноября 2011

Мне нужно решение для хэш-карты, в котором ключ является уникальным объектом-инвестором, а значение - объектом портфеля.

Проблема заключается в том, что мне нужно отсортировать инвесторов по их объекту-портфелю, который имеетОбщая стоимость внутри, которая постоянно меняется, когда он / она покупает / продает акции.

Как можно решить эту проблему?спасибо!

Ответы [ 3 ]

1 голос
/ 08 ноября 2011

В зависимости от ваших требований, я думаю, что лучшее решение - хранить значения в стандартном Map, но предоставить метод для получения Портфелей в порядке ImmutableSortedSet<Portfolio> getSortedPortfolios().Метод получит список значений и поместит их в Set.Это предполагает, что Portfolios implements Comparable в противном случае вам потребуется предоставить Comparator.

ImmutableSortedSet<Portfolio> getSortedPortfolios(){
   return ImmutableSortedSet.builder()
             .addAll(myMap.getValues())
             .build();
}

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

ImmutableSortedSet<Portfolio> getSortedPortfolios(){
   ImmutableSortedSet.Builder<Portfolio> builder = ImmutableSortedSet.builder();

   for (Portfolio p : myMap.getValues()){
      builder.add(new Portfolio(p));
   }

   return builder.build();
}

Я использую ImmutableSortedSet в Guava, но вы можете просто использовать SortedSet и рассматривать его как неизменный или использовать Collection.unmodifiable ...

1 голос
/ 08 ноября 2011

Проблема в том, что мне нужно, чтобы инвесторы сортировались по их объекту портфеля, который имеет общую стоимость внутри, которая постоянно, когда он / она покупает / продает акции.«постоянно изменяющийся» - вот сложная часть.

AFAIK, это не эффективная (т. е. O (logN) или лучшая производительность) структура данных, которая может сохранять сортировку по постоянно меняющимся значениям.Все API-интерфейсы карт общего назначения, с которыми я сталкивался, предполагают, что ключи не меняются, когда отображение является членом карты.

Итак, я думаю, вам придется использовать механизм событий для отслеживания "изменений".значения "события для объекта Portfolio.Обработчику событий потребуется атомарно удалить Портфолио из упорядоченного отображения, внести изменения, а затем снова добавить его в новой позиции.

Для реализации структур данных вам понадобится либо пара карт, либодвунаправленная карта.

0 голосов
/ 08 ноября 2011

Насколько я знаю, библиотека Java не имеет структуры данных, которая бы соответствовала вашим требованиям. Но вы можете использовать TreeBidiMap в общей библиотеке коллекции

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