Chcę mieć mapę ze zduplikowanymi kluczami.
Wiem, że istnieje wiele implementacji map (Eclipse pokazuje mi około 50), więc założę się, że musi istnieć taka, która na to pozwala. Wiem, że łatwo jest napisać własną mapę, która to robi, ale wolałbym użyć istniejącego rozwiązania.
Może coś w kolekcjach-wspólnych lub kolekcjach-google?
java
duplicates
guava
multimap
IAdapter
źródło
źródło
Odpowiedzi:
Szukasz multimapy i rzeczywiście, zarówno wspólne kolekcje, jak i guawa, mają do tego kilka implementacji. Multimapy pozwalają na użycie wielu kluczy, utrzymując zbiór wartości na klucz, tj. Możesz umieścić pojedynczy obiekt na mapie, ale pobierasz kolekcję.
Jeśli możesz używać Java 5, wolałbym Guava,
Multimap
ponieważ jest świadoma generycznych.źródło
com.google.common.collect.HashMultimap
mareadObject
/writeObject
Methods, podobnie jak ArrayListMultimap i Immutable {List, Set} Multimap. Uznałbym bezużyteczną deserializowaną instancję za błąd, który warto zgłosić.Nie musimy polegać na zewnętrznej bibliotece Google Collections. Możesz po prostu zaimplementować następującą mapę:
Upewnij się, że dostroiłeś kod.
źródło
Wynik to:
Uwaga: musimy zaimportować pliki biblioteczne.
http://www.java2s.com/Code/Jar/g/Downloadgooglecollectionsjar.htm
lub https://commons.apache.org/proper/commons-collections/download_collections.cgi
źródło
Możesz po prostu przekazać tablicę wartości dla wartości w zwykłym HashMap, symulując w ten sposób zduplikowane klucze, i to od Ciebie zależy, jakich danych użyjesz.
Możesz też po prostu użyć MultiMapy , chociaż sam nie podoba mi się pomysł duplikowania kluczy.
źródło
TreeMap<String, ArrayList<MyClass>>
rozwiązało moje zduplikowane kluczowe potrzeby.Jeśli chcesz iterować po liście par klucz-wartość (jak napisałeś w komentarzu), to lista lub tablica powinny być lepsze. Najpierw połącz swoje klucze i wartości:
Zastąp Class1 i Class2 typami, których chcesz użyć dla kluczy i wartości.
Teraz możesz umieścić je w tablicy lub liście i iterować po nich:
źródło
Ten problem można rozwiązać za pomocą listy wpisów na mapie
List<Map.Entry<K,V>>
. Nie musimy używać ani zewnętrznych bibliotek, ani nowej implementacji Map. Wpis mapy można utworzyć w następujący sposób:Map.Entry<String, Integer> entry = new AbstractMap.SimpleEntry<String, Integer>("key", 1);
źródło
źródło
Ucz się na moich błędach ... proszę, nie wdrażaj tego samodzielnie. Multimap Guava to droga do zrobienia.
Typowym ulepszeniem wymaganym w multimapach jest uniemożliwienie zduplikowanych par klucz-wartość.
Wdrażanie / zmienianie tego w implementacji może być denerwujące.
W guawie jest to tak proste, jak:
źródło
Miałem nieco inny wariant tego problemu: wymagane było skojarzenie dwóch różnych wartości z tym samym kluczem. Po prostu zamieszczając go tutaj, na wypadek, gdyby pomogło innym, jako wartość wprowadziłem HashMap:
W powyższym kodzie klucz frameID jest odczytywany z pierwszego ciągu pliku wejściowego w każdym wierszu, wartość frameTypeHash jest konstruowana przez podzielenie pozostałej linii i pierwotnie była przechowywana jako obiekt String, przez pewien czas plik zaczął mieć wiele wierszy ( z różnymi wartościami) skojarzony z tym samym kluczem frameID, więc frameTypeHash został nadpisany ostatnią linią jako wartością. Zastąpiłem obiekt String innym obiektem HashMap jako polem wartości, co pomogło w utrzymaniu pojedynczego klucza do różnych mapowań wartości.
źródło
Nie są wymagane żadne wymyślne biblioteki. Mapy są definiowane przez unikalny klucz, więc nie zginaj ich, używaj listy. Strumienie są potężne.
I to wszystko. Przykłady użycia:
źródło
źródło
java-map-duplicate-keys
źródło
a co z takim implem MultiMap?
źródło
Czy mógłbyś również wyjaśnić kontekst, dla którego próbujesz zaimplementować mapę ze zduplikowanymi kluczami? Jestem pewien, że mogłoby być lepsze rozwiązanie. Mapy mają na celu przechowywanie unikalnych kluczy nie bez powodu. Chociaż jeśli naprawdę chcesz to zrobić; zawsze możesz rozszerzyć klasę i napisać prostą niestandardową klasę mapy, która ma funkcję ograniczania kolizji i umożliwiłaby przechowywanie wielu wpisów z tymi samymi kluczami.
Uwaga: Należy zaimplementować funkcję ograniczania kolizji, tak aby kolidujące klucze były konwertowane na unikalny zestaw „zawsze”. Coś prostego, jak dodanie klucza z hashcode obiektu czy coś takiego?
źródło
aby być kompletnym, Apache Commons Collections ma również MultiMap . Wadą jest oczywiście to, że Apache Commons nie używa Generics.
źródło
Przy odrobinie hackowania możesz użyć HashSet ze zduplikowanymi kluczami. OSTRZEŻENIE: jest to silnie zależne od implementacji HashSet.
źródło
Jeśli istnieją zduplikowane klucze, klucz może odpowiadać więcej niż jednej wartości. Oczywistym rozwiązaniem jest mapowanie klucza do listy tych wartości.
Na przykład w Pythonie:
źródło
Użyłem tego:
java.util.List<java.util.Map.Entry<String,Integer>> pairList= new java.util.ArrayList<>();
źródło