2010-11-11 21 views
6

olarak sıfırlayın En iyi yol nedir?HashMap <String, boolean> tüm anahtarları HashMap <String, Tamsayı> içine kopyalayın ve değerleri

Sadece anahtarlama ve sıfırlama, ya da başka bir daha zarif veya varolan kitaplık yöntemi var. Google'ın guava java kütüphanesini de kullanabiliyor muyum?

Listeler için kopyalama yöntemine veya Map'in putAll yöntemine benzer bir şey olup olmadığını kontrol etmek istedim, ancak yalnızca anahtarlar için.

+0

Lütfen, sorunuzu tekrarlayın, anlayamadım. – Isac

+0

Sadece anahtarlar arasında dolaşırdım, sadece üç satır kod alırdı. Daha kısa istiyorsan, bunu yapmak için bir yöntem yazabilirsin. –

+2

Bir Harita yerine bir Multiset kullanıyorsanız, tüm anahtarları sıfırlamak zorunda olmadığınıza dikkat edin. Yeni bir anahtarın herhangi bir sayısını ilk defa eklediğinizde, sizin için bunu başlatacaktır. –

cevap

18

burada fantezi bir şey için çok ihtiyaç olduğunu düşünmüyorum :

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

Niçin ZERO adlı sabit bir dosya oluşturuluyor? Değere anlam katmazsa, neden 0 kullanmayın? – Isac

+0

@Isac: Emin değil, her döngü için Integer.valueOf (0) değerlendirilemez mi? – pgras

+1

@Isac: Performans açısından biraz daha iyi olabilen her yinelemeyi bokstan kaçınmak için oldukça emin olun. Azaltılmış berraklığa değer gibi hissetmiyorum. – ColinD

2

Döngü güzel:

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

Eğer Guava ile süslü bir şey istiyorum yoksa, bu seçeneği vardır kolay (ve inelegant değil). Orijinal Map'un anahtarlarının üzerinde yineleyin ve bunları yeni kopyaya sıfır değeriyle koyun.

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

Yardım edin.

+5

'Yeni Tamsayı (0)' yı kullanmak yığının çok israfıdır. 0'ı kullanmayı ve otomatik kutu çalışmasına izin vermeyi düşünün veya otomatik kutulamayı reddederseniz, 'Integer.valueOf (0) 'komutunu kullanın. –

+0

Sadece basit bir cevap vermeye çalışıyordum. Ve otomatik kutulama yeni Tamsayı (0) ile aynıdır, değil mi? Evet, Integer.valueOf (0) daha az bellek kullanırdı. – Todd

+4

Hayır, 'Integer.valueOf (0)' (-128 ve 127 arasındaki sayılar için önbelleğe alınmış kutulu değerleri kullanır) yapar. –

İlgili konular