java - हैश मैप को सीधे कैसे शुरू करें(शाब्दिक तरीके से)?




dictionary collections (4)

इस प्रश्न का उत्तर यहां दिया गया है:

जावा हैश मैप को इस तरह शुरू करने का कोई तरीका है ?:

Map<String,String> test = 
    new HashMap<String, String>{"test":"test","test":"test"};

सही वाक्यविन्यास क्या होगा? मुझे इसके बारे में कुछ भी नहीं मिला है। क्या यह संभव है? मैं मानचित्र में कुछ "अंतिम / स्थैतिक" मान डालने का सबसे छोटा / तेज़ तरीका ढूंढ रहा हूं जो कभी भी परिवर्तित नहीं होता है और मानचित्र बनाते समय अग्रिम में जाना जाता है।


ऐसा करने का कोई सीधा तरीका नहीं है - जावा में कोई नक्शा अक्षर नहीं है (अभी तक - मुझे लगता है कि उन्हें जावा 8 के लिए प्रस्तावित किया गया था)।

कुछ लोग इसे पसंद करते हैं:

Map<String,String> test = new HashMap<String, String>(){{
       put("test","test"); put("test","test");}};

यह हैश मैप का अज्ञात सबक्लास बनाता है, जिसका उदाहरण प्रारंभकर्ता इन मानों को रखता है। (वैसे, एक मानचित्र में एक ही मूल्य में दो बार नहीं हो सकता है, आपका दूसरा पॉट पहले को ओवरराइट करेगा। मैं अगले उदाहरणों के लिए अलग-अलग मानों का उपयोग करूंगा।)

सामान्य तरीका यह होगा (स्थानीय चर के लिए):

Map<String,String> test = new HashMap<String, String>();
test.put("test","test");
test.put("test1","test2");

यदि आपका test मानचित्र एक आवृत्ति चर है, तो प्रारंभकर्ता को एक कन्स्ट्रक्टर या इंस्टेंस प्रारंभकर्ता में रखें:

Map<String,String> test = new HashMap<String, String>();
{
    test.put("test","test");
    test.put("test1","test2");
}

यदि आपका test मैप एक क्लास वैरिएबल है, तो प्रारंभिक प्रारंभिक प्रारंभकर्ता में रखें:

static Map<String,String> test = new HashMap<String, String>();
static {
    test.put("test","test");
    test.put("test1","test2");
}

यदि आप चाहते हैं कि आपका नक्शा कभी भी न बदल जाए, तो आपको प्रारंभिकता के बाद अपना नक्शा Collections.unmodifiableMap(...) द्वारा लपेटना चाहिए। आप इसे एक स्थिर प्रारंभकर्ता में भी कर सकते हैं:

static Map<String,String> test;
{
    Map<String,String> temp = new HashMap<String, String>();
    temp.put("test","test");
    temp.put("test1","test2");
    test = Collections.unmodifiableMap(temp);
}

(मुझे यकीन नहीं है कि क्या आप अब test फाइनल कर सकते हैं ... इसे आज़माएं और यहां रिपोर्ट करें।)


नहीं, आपको मैन्युअल रूप से सभी तत्व जोड़ना होगा। आप एक स्थिर प्रारंभकर्ता का उपयोग कर सकते हैं हालांकि:

public class Demo
{
    private static final Map<String, String> myMap;
    static
    {
        myMap = new HashMap<String, String>();
        myMap.put("a", "b");
        myMap.put("c", "d");
    }
}

ध्यान दें कि प्रारंभ करने के लिए फ़ंक्शन का उपयोग करना वही होगा लेकिन कोड की पठनीयता में सुधार हो सकता है:

public class Demo
{
    private static final Map<String, String> myMap = createMap();
    private static Map<String, String> createMap()
    {
        Map<String,String> myMap = new HashMap<String,String>();
        myMap.put("a", "b");
        myMap.put("c", "d");
        return myMap;
    }
}

जावा 9

जावा 9 में कुछ कारखाने-विधियों को जोड़ा गया है जिनका उपयोग नक्शे के निर्माण को सरल बनाने के लिए भी किया जा सकता है:

public class Demo {
    private static final Map<String, String> test = Map.of("a", "b", "c", "d");
    private static final Map<String, String> test2 = Map.ofEntries(
        entry("a", "b"),
        entry("c", "d")
    );
}

ऊपर दिए गए उदाहरण में मैप को व्यक्त करने के विभिन्न तरीकों के साथ test और test2 दोनों समान होंगे। Map.of विधि को मानचित्र में दस तत्वों के लिए परिभाषित किया गया है, जबकि Map.ofEntries विधि में ऐसी कोई सीमा नहीं होगी।

ध्यान दें कि इस मामले में परिणामी मानचित्र एक अपरिवर्तनीय मानचित्र होगा। यदि आप मानचित्र को उत्परिवर्तनीय बनाना चाहते हैं, तो आप इसे फिर से कॉपी कर सकते हैं, उदाहरण के लिए mutableMap = new HashMap<>(Map.of("a", "b"));

( जेईपी 26 9 और Javadoc भी देखें)


ये एक तरीका है।

HashMap<String, String> h = new HashMap<String, String>() {{
    put("a","b");
}};

हालांकि, आपको सावधान रहना चाहिए और यह सुनिश्चित करना चाहिए कि आप उपर्युक्त कोड को समझें (यह एक नई कक्षा बनाता है जो हैश मैप से प्राप्त होता है)। इसलिए, आपको यहां और पढ़ना चाहिए: http://www.c2.com/cgi/wiki?DoubleBraceInitialization आरंभ, या बस अमरूद का उपयोग करें:

Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);

सादा जावा 7 कक्षाओं और varargs का उपयोग कर एक विकल्प: इस विधि के साथ एक वर्ग HashMapBuilder बनाएँ:

public static HashMap<String, String> build(String... data){
    HashMap<String, String> result = new HashMap<String, String>();

    if(data.length % 2 != 0) 
        throw new IllegalArgumentException("Odd number of arguments");      

    String key = null;
    Integer step = -1;

    for(String value : data){
        step++;
        switch(step % 2){
        case 0: 
            if(value == null)
                throw new IllegalArgumentException("Null key value"); 
            key = value;
            continue;
        case 1:             
            result.put(key, value);
            break;
        }
    }

    return result;
}

इस तरह की विधि का प्रयोग करें:

HashMap<String,String> data = HashMapBuilder.build("key1","value1","key2","value2");




initialization