Używam tego kodu do konwersji Set
na List
:
Map<String, List<String>> mainMap = new HashMap<>();
for (int i=0; i < something.size(); i++) {
Set<String> set = getSet(...); //returns different result each time
List<String> listOfNames = new ArrayList<>(set);
mainMap.put(differentKeyName, listOfNames);
}
Chcę uniknąć tworzenia nowej listy w każdej iteracji pętli. Czy to jest możliwe?
java
performance
list
set
Muhammad Imran Tariq
źródło
źródło
Odpowiedzi:
Możesz użyć metody List.addAll () . Akceptuje kolekcję jako argument, a twój zestaw jest kolekcją.
EDYCJA: w odpowiedzi na edycję pytania.
Łatwo jest zauważyć, że jeśli chcesz mieć
Map
zeList
s jako wartości, aby mieć różne wartości k, trzeba utworzyć k różnych list.Zatem: Nie można w ogóle uniknąć tworzenia tych list, listy będą musiały zostać utworzone.
Możliwe obejście:
zadeklaruj
Map
jakoMap<String,Set>
lubMap<String,Collection>
zamiast, i po prostu wstaw swój zestaw.źródło
differentKeyName
zmienia się każda iteracja? Czy faktycznie chceszsomething.size()
różnych możliwych wartości na swoich mapach? Łatwo zauważyć, że mapa zk
listami jako wartościami musi tworzyć przynajmniejk
listy.Użyj konstruktora, aby go przekonwertować:
źródło
Również z biblioteki Guava Collect możesz użyć
newArrayList(Collection)
:Byłoby to bardzo podobne do poprzedniej odpowiedzi z amit , z tym wyjątkiem, że nie musisz deklarować (ani instynktować) żadnego
list
obiektu.źródło
ArrayList
konstruktor.new ArrayList<>([your_set])
.W Javie 8 możemy użyć jednego linera:
Oto jeden mały przykład:
źródło
Chciałem bardzo szybko przekonwertować mój zestaw na List i zwrócić go, więc zrobiłem to w jednym wierszu
źródło
Możesz użyć tej zmiany jednej linii:
Arrays.asList(set.toArray(new Object[set.size()]))
źródło
Chciałbym zrobić :
źródło
Ponieważ nie wspomniano do tej pory, od wersji Java 10 można korzystać z nowej
copyOf
metody fabrycznej:Z Javadoc :
źródło
Java 8 zapewnia opcję korzystania ze strumieni i możesz uzyskać listę z
Set<String> setString
:Chociaż wewnętrzna implementacja zapewnia obecnie wystąpienie
ArrayList
:ale JDK tego nie gwarantuje. Jak wspomniano tutaj :
Jeśli chcesz być zawsze pewien, możesz poprosić o wystąpienie, w szczególności jako:
źródło
Tworzę prostą
static
metodę:... lub jeśli chcesz ustawić typ listy, możesz użyć:
źródło
Ostatnio znalazłem to:
źródło
public static <T> ArrayList<T> list(Enumeration<T> e) { ArrayList<T> l = new ArrayList<>(); while (e.hasMoreElements()) l.add(e.nextElement()); return l; }
Ze względu na kompletność ...
Powiedz, że naprawdę chcesz traktować
Map
wartości jakoList
s, ale chcesz uniknąć kopiowaniaSet
do zaList
każdym razem.Na przykład, może wywołujesz jedną funkcję biblioteczną, która tworzy
Set
, ale przekazujesz swójMap<String, List<String>>
wynik do (słabo zaprojektowanej, ale wymykającej się z ręki) funkcji bibliotecznej, która bierze tylkoMap<String, List<String>>
, chociaż jakoś wiesz, że operacje, które wykonuje zList
s mają jednakowe zastosowanie do dowolnychCollection
(a zatem dowolnychSet
). I z jakiegoś powodu musisz unikać narzutu / pamięci związanego z kopiowaniem każdego zestawu do listy.W tym bardzo niszowym przypadku, w zależności od (być może niepoznawalnego) zachowania funkcji biblioteki
List
wymaganej od ciebie , możesz być w stanie stworzyćList
widok każdego zestawu. Zauważ, że jest to z natury niebezpieczne (ponieważ wymagania funkcji bibliotecznych dla każdej z nichList
mogą prawdopodobnie ulec zmianie bez twojej wiedzy), dlatego należy preferować inne rozwiązanie. Ale oto jak to zrobisz.Utworzyłbyś klasę, która implementuje
List
interfejs, bierzeSet
konstruktora i przypisuje ten zestaw do pola, a następnie używa tego wewnętrznegoSet
do implementacjiList
interfejsu API (w możliwym zakresie i pożądanym).Zwróć uwagę, że niektóre zachowania List po prostu nie będą w stanie naśladować bez przechowywania elementów jako a
List
, a niektóre zachowania będą tylko częściowo możliwe do naśladowania. Ponownie, ta klasa nie jestList
ogólnie bezpiecznym zamiennikiem dla s. W szczególności, jeśli wiesz, że przypadek użycia wymaga operacji związanych z indeksem lub MUTOWANIAList
, to podejście pójdzie bardzo szybko na południe.źródło
Uważam, że to działa dobrze i przydatne do tworzenia listy z zestawu.
źródło
źródło