2009-06-22 17 views
8

मुझे किसी प्रकार के संग्रह में कुंजी/मूल्य जानकारी स्टोर करने की आवश्यकता है।सी # शरणार्थी जावा संग्रह का थोड़ा सा प्रयास करता है

var entries = new Dictionary<string, int>(); 
entries.Add("Stop me", 11); 
entries.Add("Feed me", 12); 
entries.Add("Walk me", 13); 

तो मैं मान तो का उपयोग होगा::

int value = entries["Stop me"]; 

मैं जावा में ऐसा कैसे करते हैं सी # में, मैं इस तरह एक शब्दकोश निर्धारित करेंगे? मैंने ArrayList के साथ उदाहरण देखे हैं, लेकिन यदि संभव हो तो मुझे जेनेरिक के साथ समाधान चाहिए।

+1

सी # शरणार्थी? क्या वह पाप की स्थिति नहीं है? :)) –

+0

एक एपिफेनी की तरह अधिक :) – skaffman

+0

ऐरेलिस्ट एक अनुक्रम या सूची-जैसे निर्माण (एक शब्दकोश नहीं) है, हालांकि यह सामान्य –

उत्तर

22

की तरह कुछ के लिए आप का उपयोग करने के लिए एक Map

Map<String, Integer> m = new HashMap<String, Integer>(); 
m.put("Stop me", 11); 
Integer i = m.get("Stop me"); // i == 11 

ध्यान दें कि अंतिम पंक्ति पर, मैंने कहा जा सकता था चाहते हैं:

int i = m.get("Stop me"); 

जो जावा के ऑटो-अनबॉक्सिंग के साथ शॉर्टेंड है:

int i = m.get("Stop me").intValue() 

यदि दिए गए कुंजी पर मानचित्र में कोई मूल्य नहीं है, तो getnull देता है और यह अभिव्यक्ति NullPointerException फेंकता है। इसलिए यह इस मामले

2

ऐसा लगता है कि आप देख रहे हैं की तरह HashMap

1

आप निश्चित रूप से एक HashMap चाहते हैं, सी # Dictionary के जावा संस्करण है, जिसमें बॉक्स्ड प्रकारInteger उपयोग करने के लिए हमेशा एक अच्छा विचार है।

6

आप जावा में Map का उपयोग करते हैं।

ध्यान दें कि आप एक सामान्य प्रकार पैरामीटर के रूप में int उपयोग नहीं कर सकते (या किसी अन्य आदिम प्रकार), लेकिन autoboxing की वजह से, यह अभी भी व्यवहार करती है लगभग जैसे कि यह एक Map<String, Integer> के बजाय एक Map<String, int> थे। (आप नहीं प्रदर्शन के प्रति संवेदनशील कोड में autoboxing का एक बहुत कर रही है, हालांकि चाहते हैं।)

Map<String, Integer> entries = new HashMap<String, Integer>(); 
entries.put("Stop me", 11); 
entries.put("Feed me", 12); 
entries.put("Walk me", 13); 
int value = entries.get("Stop me"); // if you know it exists 
// If you're not sure whether the map contains a value, it's better to do: 
Integer boxedValue = entries.get("Punch me"); 
if (boxedValue != null) { 
    int unboxedValue = boxedValue; 
    ... 
} 
+0

है आपकी अंतिम पंक्ति खतरनाक है: यदि उस कुंजी पर मानचित्र में कोई मूल्य नहीं है, तो अनबॉक्सिंग –

+0

हाँ, अच्छा बिंदु के उपयोग के कारण एक NullPointerException फेंक देगा। Autoboxing बहुत अच्छा है, लेकिन unboxing वास्तव में इतना मदद नहीं करता है। –

+0

@NotNull एनोटेशन पर रोल –

7

एक java.util.Map का प्रयोग करें। वहाँ कई कार्यान्वयन हैं:

  • HashMap: हे (1) देखने, प्रबंधित नहीं करता है चाबियों का आदेश
  • TreeMap: हे (लॉग एन) देखने, चाबियों का आदेश, उन पर एक में रखता है ताकि आप पुनरावृति कर सकते हैं गारंटीकृत आदेश
  • LinkedHashMap: ओ (1) लुकअप, क्रम में कुंजी पर दोहराए गए क्रम में वे मानचित्र में जोड़े गए थे। ,

    Map<String,Integer> map = new HashMap<String,Integer>(); 
    map.put("Stop me", 11); 
    map.put("Feed me", 12); 
    
    int value = map.get("Stop me"); 
    

    जोड़ा संग्रह के साथ काम कर रहे सुविधा के लिए Google Collections library पर एक नजर है:

आप की तरह उपयोग करते हैं। उत्कृष्ट है।

+0

दोहराएं टिप्पणी: आपकी आखिरी पंक्ति खतरनाक है: यदि उस कुंजी पर मानचित्र में कोई मूल्य नहीं है, तो यह मानचित्र कार्यान्वयन –

+0

+1 के उपयोग के कारण एक नलपॉन्टर अपवाद को फेंक देगा। उस कुंजी के साथ मानचित्र में एक मूल्य है! लेकिन स्पष्टीकरण के लिए, आप पहले नक्शा की विधि को कॉल करके लापता कुंजी की जांच करेंगे और/या जांच लेंगे कि प्राप्त (कुंजी) का नतीजा शून्य नहीं है। उत्तरार्द्ध कम संभावना है, क्योंकि यह वस्तुओं के बीच mulls पारित करने के लिए खराब अभ्यास है। – dfa

+0

के बारे में व्याख्या के लिए अनबॉक्सिंग – Nat

1
Map<String, Integer> map = new HashMap<String, Integer>(); 
map.put("Stop Me", 11); 
map.put("Feed Me", 12); 
map.put("Walk Me", 13); 
Integer x; // little hack 
int value = (x = a.get("aaa")) == null? 0 : x; 

विकल्प के रूप में आप Enum कोशिश कर सकते हैं:

enum Action { 

    STOP(11), 
    FEED(12), 
    WALK(13); 

    private final int value; 

    private Action(int value) { 
     this.value = value; 
    } 

    public int value() { 
     return value; 
    } 

    public static Action valueOf(int value) { 
     for (Action action : values()) { 
      if (action.value == value) { 
       return action; 
      } 
     } 

     return null; // or a null-object 
    } 
} 

परीक्षण:

public void action() { 
    Action action = Action.valueOf("FEED"); 
    // or Action.FEED for more compile-time safety 
    int value = action.value(); 
    // instantiating by code 
    Action walk = Action.valueOf(13); 
} 
+1

दोहराएं टिप्पणी: आपकी आखिरी पंक्ति खतरनाक है: यदि उस कुंजी पर मानचित्र में कोई मूल्य नहीं है, तो यह एक बॉक्सिंग प्रकार का उपयोग करके –

+0

अच्छा बिंदु अनबॉक्सिंग के उपयोग के कारण एक NullPointerException फेंक देगा – dfa

+0

आइए उम्मीद करें कि उपयोगकर्ता के पास है वे नाम जो कानूनी जावा पहचानकर्ता हैं। – akarnokd

संबंधित मुद्दे