2010-12-09 22 views
6

String anahtar ve ilkel değerini alan bir eşleme oluşturmak istiyorum. Java belgelerine bakıyordum ve Primitif'in bir sınıf tipi olduğunu ya da bir çeşit sarma sınıfını paylaştığını görmedim.Java Eşlemeleri ve İlkeleri

Değeri ilkel olmak için nasıl kısıtlayabilirim?

Map<String, Primitive> map = new HashMap<String, Primitive>();

+0

Belirsiz olduğum için benim hatamdı. Demek istediğim, değeri ilkel bir tür olmaya zorlamak istiyorum, demek istediğim, ilkel türlerin herhangi birinin o belirli haritada bir değer olarak kullanılmasına izin vermek istiyorum. – Prospero

cevap

7

Java Autoboxing, Long, Integer, Double üzerinde haritalar oluşturmaya ve daha sonra bunları ilkel değerler kullanarak çalıştırmaya izin verir. Örneğin: bir harita farklı ilkel türde saklamak istiyorsanız

java.util.HashMap<String, Integer> map = new java.util.HashMap<String, Integer>(); 
map.put("one", 1); // 1 is an integer, not an instance of Integer 

, bir Map<String, Number> yaparak bunu çevrilevilebilecekleri. değerlerini saklamak sağlar BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short (ve AtomicLong, AtomicInteger). İşte

bir örnek: "Java İlkel Haritalar"

Map<String, Number> map = new HashMap<String, Number>(); 

map.put("one", 1); 
map.put("two", 2.0); 
map.put("three", 1L); 

for(String k:map.keySet()) { 
    Number v = map.get(k); 
    System.err.println(v + " is instance of " + v.getClass().getName() + ": " + v); 
} 
+0

Bir ya da maddeyi belirtmek için jeneriklerle bir yol var mı? Örneğin, Prospero

+0

@Doodle 'Araç' bir temel sınıf yapmalı ve 'Tekne, Araba' içinde uzatmalı ve sonra 'yapmalısınız. – khachik

+1

Evet, bir süper tip Araç çıkartın ve onu Harita veya Harita (Generics sözdizimi her zaman kafamı karıştırır) – ivy

2

Aşağıdaki yapabilirsiniz:

Sonra
Map<String, Integer> map = new HashMap<String, Integer>() 

operasyonları gibi:

map.put("One", 1); 

çalışacaktır. İlkel 1, bir Integer içine otomatik kutuya sahip olacak. Aynı şekilde: Integer bir int içine otomatik kutulamasının alacak çünkü

int i = map.get("One"); 

da çalışacaktır.

autoboxing and autounboxing.

+1

'Map' bir arabirimdir. – khachik

+0

Harita aninterface .. –

+0

@khacik, düzeltildi. Bunu işaret ettiğin için teşekkürler. – jjnguy

2

Her ilkel, long için java.lang.Long gibi bir sarmalayıcı sınıfına sahiptir.

Yani Java 1.5+ kullanıyorsanız, basitçe haritaya ilkeller koymak, String için sarıcı sınıfını harita ve edebilirsiniz:

Map<String, Integer> map = new HashMap<String, Integer>(); 
map.put("key", 10); 
int value = map.get("key"); // value is 10. 
1

Onların kutulu meslektaşı kullanmak.

Map<String,Integer> map = new HashMap<String,Integer>(); 

Tam sayı, ilkel int'nin değişmez bir kutulu türüdür. Benzer Kısa, Uzun, Çift, Float ve Bayt kutulu tipler vardır.

0

Map arabiriminde anahtar veya değer olarak ilkel değeriniz olamaz. Bunun yerine, Integer, Character, Boolean vb. Gibi Sarıcı sınıflarını kullanabilirsiniz.

wiki hakkında daha fazla bilgi edinin.

+0

Autoboxing, eğer java 1.5 ileride kullanılıyorsa, ilkelleri elle sarmanıza gerek kalmaması için ona dikkat etmelidir – dimitrisli

4

Google ve Autoboxing gereksinimini ortadan bazı özel türlerini bulabilirsiniz.Bunun bir örneği şöyledir: Ancak, diğer yanıtlarda belirtildiği gibi otomatik olarak otomatik kutulama ile iyi bir performans göstermelisiniz.

+0

Bana gösterdiği için bir yumru, bu benim için yararlı olabilecek bir şeydir. – Prospero

+0

Bağlantı kesildi. – ppasler

+0

Ölü bağlantıyı güncel bir çalışma ile değiştirdim – mchr

1

Performans nedenleriyle ilkel olacak bir değere gereksiniminiz varsa, TObjectIntHashMap veya benzerlerini kullanabilirsiniz.

örn. Harita < String tamsayı> ile

TObjectIntHashMap<String> map = new TObjectIntHashMap(); 

map.put("key", 10); 
int value = map.get("key"); 

bir fark değerleri basit bir tür int yerine Integer nesnesi arasında olmasıdır.