2010-11-11 12 views
6

Jaki jest najlepszy sposób?HashMap <String, boolean> skopiuj wszystkie klucze do HashMap <String, Integer> i zainicjuj wartości do zera

Po prostu zapętlasz i wstawiasz klucz i zero, czy istnieje inna, bardziej elegancka lub istniejąca metoda biblioteki. Używam również biblioteki Google guava java, jeśli ma jakąś użyteczną funkcjonalność?

Chciałem sprawdzić, czy było coś podobnego do metody kopiowania dla list, czy metoda mapy: putAll, ale tylko dla kluczy.

+0

Proszę, przeredaguj swoje pytanie, nie mogłem tego zrozumieć. – Isac

+0

Po prostu przejdę przez klawisze, zajmie to tylko trzy linijki kodu. Jeśli chcesz, aby był krótszy, możesz napisać metodę, aby to zrobić. –

+2

Należy pamiętać, że jeśli używasz Multiset zamiast mapy, nie musisz inicjować wszystkich kluczy do zera. Za pierwszym razem, gdy dodasz dowolną liczbę wystąpień nowego klucza, zainicjujesz go za Ciebie. –

Odpowiedz

18

nie sądzę, że istnieje o wiele potrzeba niczego wyjątkowego tutaj:

Map<String, Boolean> map = ...; 
Map<String, Integer> newMap = Maps.newHashMapWithExpectedSize(map.size()); 
for (String key : map.keySet()) { 
    newMap.put(key, 0); 
} 

Jeżeli chcesz coś ozdobnego z guawy, tam jest ta opcja:

Map<String, Integer> newMap = Maps.newHashMap(
    Maps.transformValues(map, Functions.constant(0))); 

// 1-liner with static imports! 
Map<String, Integer> newMap = newHashMap(transformValues(map, constant(0))); 
1
final Integer ZERO = 0; 

for(String s : input.keySet()){ 
    output.put(s, ZERO); 
} 
+3

Po co tworzyć stałą o nazwie ZERO? Jeśli nie doda to znaczenia do wartości, dlaczego nie użyć 0? – Isac

+0

@Isac: Nie jestem pewien, ale czy wartość Integer.valueOf (0) zostanie obliczona dla każdej pętli? – pgras

+1

@Isac: Jestem pewien, że należy unikać boksowania każdej iteracji, która może być nieco lepsza pod względem wydajności. Nie wydaje mi się jednak, żeby warto było zmniejszyć jasność. – ColinD

2

pętli jest dość łatwe (i nie nieeleganckie). Iteruj kluczami oryginalnego Map i umieść je w nowej kopii o wartości zero.

Set<String> keys = original.keySet(); 
Map<String, Integer> copy = new HashMap<String, Integer>(); 
for(String key : keys) { 
    copy.put(key, 0); 
} 

Nadzieję, że pomaga.

+5

Użycie 'new Integer (0)' jest bardzo nieekonomiczne w stercie. Rozważ użycie 0 i zezwolenie na pracę z autoboxingiem lub jeśli nie cierpisz autoboxingu, użyj 'Integer.valueOf (0)'. –

+0

Próbowałem tylko dać prostą odpowiedź. A autoboxing jest taki sam jak nowy Integer (0), czyż nie? Tak, Integer.valueOf (0) zużywa mniej pamięci. – Todd

+4

Nie, robi to "Integer.valueOf (0)" (który używa buforowanych wartości w ramkach dla liczb od -128 do 127). –

Powiązane problemy