2010-06-18 9 views
11

Natknąłem się na multi_index na skowronku ubiegłej nocy, podczas gdy walenie mnie w kolekcję, do której potrzebuję uzyskać dostęp za pomocą 3 różnych wartości kluczowych, a także do ponownego zrównoważenia semantyki tablicowej. Mam jedno z moich dwóch życzeń (3 różne kluczowe wartości) w boost :: multi_index.Czy istnieje odpowiednik boost :: multi_index dla Java gdzieś?

Jestem ciekawy, czy coś podobnego istnieje w świecie Java.

+0

może być przesadą (stąd komentarzu), czy za wbudowany DB do tego? Istnieje wiele lekkich DB, które można osadzić i uruchomić w pamięci, myślę, że to zależy od wymagań wydajnościowych. – Nim

Odpowiedz

-2

nie mam pojęcia, co boost :: multi_index środki, ale w oparciu o resztę pytanie, myślę, że można mówić o multi key map

+0

Nie, przepraszam. To jest przykład słabo wpisanego, złożonego kontenera klucza. boost :: multi_index jest silnie typowany, ale co ważniejsze ma wiele niezależnych kluczy. To znaczy. w multi_index_container osób, możesz wyszukać osobę po nazwisku, SSN lub datę urodzenia. (oczywiście nazwa i DOB nie będą unikalnymi kluczami) – MSalters

1

myślę krótka odpowiedź brzmi: nie, nie ma oczywisty odpowiednik.

Przyspieszona klasa wielu indeksów jest bardzo silnie szablonowana, co nie jest łatwe do przetłumaczenia w Javie. Są generyczne, ale wcale nie są takie same. (How are Java generics different from C++ templates? Why can't I use int as a parameter?).

A więc bez szablonów, jak wyglądałaby klasa z wieloma wskaźnikami?

Wyobrażam sobie, że masz swoją klasę danych, np. Osoba, zawierająca elementy indeksu, takie jak implementacja mapy. W tym momencie, masz wybór:

  1. Dodaj jakieś „indeksy” bezpośrednio do klasę osobę (jak jakiś Hashtables) i napisać Lookup funkcje. Zarządzaj synchronizacją indeksu w klasie Osoba .
  2. napisz „IndexProvider” klasy że oddziela funkcjonalność indeksu całkowicie od osoby - musiałby być w stanie dynamicznie tworzyć różne typy indeksów i wyobrażam sobie byś synchronizacji uchwytu poprzez wywołań zwrotnych.
  3. Niektóre mieszanka 1) i 2) - jak klasy abstrakcyjne bazowy indeks funkcjonalności, która nie właściwie oddzielić zachowania ale daje pewne ponowne wykorzystanie kodu.

Myślę, że w większości przypadków 1) jest najłatwiejszy do napisania, najłatwiejszy do utrzymania i prawdopodobnie najbardziej wydajny. 2) wydaje się nadmiernym inżynierią.

Inną opcją, jeśli masz wiele struktur danych, które wymagają indeksowania, jest przechowywanie ich w bazie danych.

+0

Napisałem nową odpowiedź mówiącą o Google Guava. To może być rozwiązanie – gavioto

2

Właśnie zakończyłem MultiIndexContainer w Javie: http://code.google.com/p/multiindexcontainer/wiki/MainPage. Wiem, że to nie jest kompletny odpowiednik boost multi_index_container, ale może to wystarczy dla twoich wymagań.

+0

Dzięki, popatrzę. –

+0

Interfejs wygląda ładnie i faktycznie rozwiązuje wymagania wielu wskaźników. – Alex

+0

Wow, może czas, aby wskrzesić mój stary projekt po tak długim czasie :-) BTW Wyeksportowałem go do github https://github.com/Kamosh/multiindexcontainer, ale trudno powiedzieć, w jakim to jest kształcie. –

-1

myślę, że można znaleźć na odpowiedź w google guawy bibliotece. Prawdopodobnie multimapy rozwiązać swoje potrzeby.

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

Jak zauważył w tych wątków:

+0

'multi_index' oznacza, że ​​możesz umieścić wartość z wieloma kluczami wewnątrz i mieć grupowanie według każdego klucza. wyobraź sobie coś w rodzaju mapy plików, raz pod kluczem i raz kluczem po rozszerzeniu i tak dalej. – Alex