2010-06-18 2 views
11

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

Мне любопытно, если что-либо подобное существует в мире Java.

+0

может быть избыточна (следовательно комментарий), Вы рассмотрели встроенный DB для этого? Есть много легких DB, которые вы можете встроить и запустить в памяти, я думаю, это зависит от ваших требований к производительности .... – Nim

ответ

-2

Я понятия не имею, что повышение :: multi_index средства, но, основываясь на остальной части вашего вопроса, я думаю, вы могли бы говорить о multi key map

+0

Нет, извините. Это пример слабо типизированного составного контейнера ключей. boost :: multi_index строго типизирован, но, что более важно, он имеет несколько независимых ключей. То есть в multi_index_container людей вы можете искать человека по имени, SSN или дату рождения. (очевидно, имя и DOB не будут уникальными ключами) – MSalters

1

Я думаю, короткий ответ: нет, нет никакого очевидного равнозначны.

Класс повышения мультииндекса очень сильно затенен, что не так легко перевести на Java. Есть дженерики, но они совсем не то же самое. (How are Java generics different from C++ templates? Why can't I use int as a parameter?).

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

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

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

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

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

+0

Я опубликовал новый ответ, говорящий о google guava. Это может быть решение – gavioto

2

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

+0

Спасибо, я посмотрю. Интерфейс –

+0

выглядит красиво и на самом деле решает требования к нескольким индексам. – Alex

+0

Ничего себе, может быть, время воскресить мой старый проект после столь долгого времени :-) Кстати, я экспортировал его в github https://github.com/Kamosh/multiindexcontainer, но трудно сказать, в какой форме он находится. –

-1

Я думаю, что вы можете найти ответ в библиотеке гуавы Google. Возможно, multimaps решит ваши проблемы.

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

Как отметил в этих нитей:

+0

'multi_index' означает, что вы можете поместить значение с несколькими ключами внутри и иметь группировку по каждой клавише. представьте себе что-то вроде карты файлов, после того, как она была введена по имени и после того, как она была добавлена ​​расширением и так далее. – Alex

Смежные вопросы