Есть ли где-нибудь эквивалент boost :: multi_index для Java? - PullRequest
11 голосов
/ 18 июня 2010

Прошлой ночью я наткнулся на multi_index на жаворонке, прижимаясь головой к коллекции, к которой мне нужно получить доступ по 3 различным значениям ключа, а также к ребалансировке семантики массива. Ну, я получил одно из двух моих желаний (3 разных значения ключа) в boost::multi_index.

Существует ли что-либо подобное в мире Java?

Ответы [ 5 ]

2 голосов
/ 20 мая 2013

Воскрешение старого вопроса, но посмотрите на CQEngine как на решение.

Для справки также см. Связанный вопрос Как вы запрашиваете коллекции объектов в Java (Criteria / SQL-like)?

2 голосов
/ 23 марта 2011

Я только что закончил MultiIndexContainer на Java: http://code.google.com/p/multiindexcontainer/wiki/MainPage. Я знаю, что это не полный эквивалент boost multi_index_container, но, возможно, этого может быть достаточно для вашего требования.

1 голос
/ 04 сентября 2010

Я думаю, что короткий ответ - нет, очевидного эквивалента нет.

Мультииндексный класс boost очень сильно шаблонизирован, что нелегко перевести на Java. Есть дженерики, но они совсем не одинаковые. ( Чем дженерики Java отличаются от шаблонов C ++? Почему я не могу использовать int в качестве параметра? ).

Итак, без шаблонов, как будет выглядеть многоиндексный класс?

Я полагаю, у вас будет ваш класс данных, например Person, содержащий элементы индекса, такие как реализация Map. На данный момент у вас есть выбор:

  1. Добавить некоторые "индексы" непосредственно в класс Person (как у некоторых Hashtables) и написать поиск функции. Управление индексом синхронизация внутри человека класс.
  2. Написать класс IndexProvider что разъединяет индекс функциональность полностью от человека - это должно быть в состоянии динамически создавать разные индексы типы, и я думаю, вы бы обрабатывать синхронизацию через Обратные вызовы.
  3. Некоторая смесь 1) и 2) - как абстрактный базовый класс для индекса функциональность, которая не правильно отделить поведение, но действительно обеспечивает некоторое повторное использование кода.

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

Другой вариант, если у вас много структур данных, которые нуждаются в индексации, это сохранить их в базе данных.

0 голосов
/ 22 января 2015

Я думаю, вы можете найти ответ в библиотеке Google Guava.Вероятно, мультикарты решат ваши потребности.

https://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained

Как прокомментировано в этих темах:

0 голосов
/ 18 июня 2010

Понятия не имею, что означает boost :: multi_index, но, основываясь на остальной части вашего вопроса, я думаю, вы могли бы говорить о многоключевой карте

...