Jak przekształcić listę w mapę za pomocą Google collections?
Mam listę łańcuchów i mam funkcję do generowania wartości dla każdego klucza na liście.
Chcę utworzyć mapę za pomocą tej funkcji. Czy Mogę to zrobić z Google collections?
5 answers
Od 26.07.2012 guava master zawiera dwa nowe sposoby na to. Powinny być w wersji 14.0.
Maps.asMap(Set<K>, Function<? super K, V>)
(a dwa przeciążenia dla SortedSet
i NavigableSet
) pozwalają wyświetlić Set
plus a Function
jako Map
, gdzie wartość dla każdego klucza w zestawie jest wynikiem zastosowania funkcji do tego klucza. Wynikiem jest widok, więc nie kopiuje zestawu wejściowego, a wynik Map
zmieni się w miarę działania zestawu i odwrotnie.
Maps.toMap(Iterable<K>, Function<? super K, V>)
przyjmuje an Iterable
i chętnie konwertuje je na an ImmutableMap
gdzie poszczególne elementy iterowalne są kluczami, a wartości są wynikiem zastosowania funkcji do każdego klucza.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-27 01:25:43
Użyj Map.uniqueIndex( Iterable, Function) :
Zwraca niezmienną mapę, dla której Mapa.wartości() to podane elementy w danej kolejności, a każdy klucz jest produkt wywołania dostarczonego funkcja na odpowiadającej jej wartości. (z javadoc)
Przykład:
Map<String,String> mappedRoles = Maps.uniqueIndex(yourList, new Function<String,String>() {
public String apply(String from) {
// do stuff here
return result;
}});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-24 21:50:22
EDIT: jest całkowicie możliwe, że Sean ma rację i źle zrozumiałem pytanie.
Jeśli oryginalna lista ma być kluczami , to wygląda na to, że możesz po prostu użyć mapy obliczeniowej, poprzez MapMaker.makeComputingMap
, i Ignoruj listę wejściową na początek. EDIT: jak wspomniano w komentarzach, jest to teraz przestarzałe i usunięte w Guava 15.0. spójrz na CacheBuilder
zamiast tego.
Z drugiej strony, to również nie daje mapy, która zwróci null, jeśli zapytasz go o wartość odpowiadającą kluczowi, którego nie było na liście. To również nie daje w innych słowach, to może dobrze Nie być odpowiednie, ale warto rozważyć, w zależności od tego, co próbujesz z nim zrobić. :)
Zostawię tutaj tę odpowiedź, chyba, że skomentujesz, że żadne podejście tutaj nie jest dla ciebie użyteczne, w takim przypadku je skasuję.
Oryginalna odpowiedź
Używając guawa możesz to zrobić dość łatwo z Maps.uniqueIndex
:
Map<String, String> map = Maps.uniqueIndex(list, keyProjection);
(wspomniałem konkretnie o Guava w przeciwieństwie do zbiorów Google, ponieważ nie sprawdziłem, czy starsze repozytorium zbiorów Google zawiera Maps.uniqueIndex
.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-29 10:34:14
Albo źle zrozumiałam ciebie, albo inne plakaty. Rozumiem, że chcesz, aby Twoja lista była kluczem do mapy, podczas gdy Maps.uniqueIndex()
tworzy Klucze do mapowania wartości (co jest wręcz przeciwne).
W każdym razie istnieje otwarty problem z Guavą , który wymaga dokładnej funkcjonalności, o którą prosisz, a ja również zaimplementowałem takie rozwiązanie w poprzednim pytaniu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:31
Używanie Guawy + Lamba
Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-29 09:19:04