2010-12-09 6 views
6

Ich möchte ein Mapping erstellen, das eine String als Schlüssel und Primitive als Wert verwendet. Ich sah mir die Java-Dokumente an und konnte nicht erkennen, dass Primitive ein Klassentyp war oder dass sie eine Art Wrapping-Klasse teilten.Java-Mappings und Primitive

Wie kann ich den Wert auf ein primitiv beschränken?

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

+0

Es war meine Schuld für Unklarheiten. Was ich sage Ich möchte den Wert auf einen primitiven Typ beschränken Ich meine, dass ich zulassen soll, dass einer der primitiven Typen als Wert in dieser spezifischen Map verwendet wird. – Prospero

Antwort

7

Java Autoboxing ermöglicht es, Karten auf Long, Integer, Double zu erstellen und sie dann mit primitiven Werten zu betreiben. Zum Beispiel:

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 

Wenn Sie in einer Karte verschiedene primitive Typen speichern möchten, können Sie es durch einen Map<String, Number> machen. Ermöglicht zum Speichern von Werten von BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short (und AtomicLong, AtomicInteger). Hier

ein Beispiel:

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

Gibt es eine Möglichkeit mit Generics eine oder Klausel zu spezifizieren? Sprich zum Beispiel Prospero

+0

@Doodle sollten Sie eine Basisklasse 'Vehicle' machen und diese in' Boot, Car' erweitern und dann '' machen. – khachik

+1

Ja, extrahiere ein übergeordnetes Fahrzeug und mache daraus eine Map oder Map (die Generics-Syntax verwirrt mich immer) – ivy

2

Sie können folgendes tun:

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

Dann Operationen wie:

map.put("One", 1); 

arbeiten. Das primitive 1 wird automatisch in eine Integer Box eingereiht. Ebenso:

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

funktioniert auch, weil die Integer wird auto-unboxed in eine int bekommen.

Überprüfen Sie einige Dokumentation auf autoboxing and autounboxing.

+1

'Map' ist eine Schnittstelle. – khachik

+0

Karte ist ein Interface .. –

+0

@khacik, behoben. Danke, dass du darauf hingewiesen hast. – jjnguy

2

Jedes Primitiv hat eine Wrapper-Klasse, wie java.lang.Long für long.

So können Sie die die Wrapper-Klasse zu String und Karte, wenn Sie Java verwenden 1.5+, einfach ausgedrückt Primitiven auf der Karte:

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

Sie ihre Box Pendant verwenden würde.

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

Integer ist ein unveränderlicher Boxed-Typ des primitiven Int. Es gibt ähnliche Short-, Long-, Double-, Float- und Byte-Boxed-Typen.

0

Sie können keine Primitive als Schlüssel oder Wert in Map Schnittstelle haben. Stattdessen können Wrapper-Klassen wie Integer, Character,undusw. verwendet werden.

Lesen Sie mehr auf wiki.

+0

Autoboxing sollte das beachten, wenn Java ab 1.5 verwendet wird, also müssen Sie die Grundelemente nicht manuell umhüllen – dimitrisli

4

Google für „Java Primitive Maps“ und Sie werden einige spezialisierte Typen finden, die die Notwendigkeit für Autoboxing vermeiden.Ein Beispiel dafür ist: https://labs.carrotsearch.com/hppc.html

Im Allgemeinen sollten Sie jedoch mit Autoboxing, wie in anderen Antworten erwähnt, gut umgehen.

+0

Das ist eine Beule, um mich schnell zu zeigen, das ist etwas, das mir nützlich sein kann, danke. – Prospero

+0

Die Verbindung ist tot. – ppasler

+0

Ich habe den toten Link durch einen aktuellen ersetzt – mchr

1

Wenn Sie aus Leistungsgründen einen primitiven Wert benötigen, können Sie TObjectIntHashMap o.ä. verwenden.

z.B.

TObjectIntHashMap<String> map = new TObjectIntHashMap(); 

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

Ein Unterschied mit Karte < String, Integer> besteht darin, dass die Werte vom Typ int sind primitiv und nicht Integer-Objekt.