java - हैश मैप और कुंजी के रूप में int




hashmap (7)

मुझे समझ में नहीं आता कि मुझे आयाम क्यों जोड़ना चाहिए (यानी: एक सरणी में int बनाना) क्योंकि मुझे केवल एक कुंजी को कुंजी के रूप में स्टोर करने की आवश्यकता है।

एक सरणी भी एक वस्तु है, इसलिए HashMap<int[], MyObject> एक वैध निर्माण है जो चाबियों के रूप में int arrays का उपयोग करता है।

कंपाइलर यह नहीं जानता कि आप क्या चाहते हैं या आपको क्या चाहिए, यह सिर्फ एक भाषा निर्माण को देखता है जो लगभग सही है, और यह चेतावनी देता है कि इसके लिए क्या गलत है।

मैं एक हैश मैप बनाने की कोशिश कर रहा हूं जिसमें कुंजी और ऑब्जेक्ट्स के रूप में पूर्णांक होगा।

मेरा वाक्यविन्यास है:

HashMap<int, myObject> myMap = new HashMap<int, myObject>();

हालांकि, लौटाई गई त्रुटि है - टोकन "int" पर सिंटेक्स त्रुटि, इस टोकन के बाद अपेक्षित आयाम - मुझे समझ में नहीं आता कि मुझे आयाम क्यों जोड़ना चाहिए (यानी: एक सरणी में int बनाना) क्योंकि मुझे केवल एक अंक स्टोर करने की आवश्यकता है कुंजी के रूप में

मैं क्या कर सकता था?

अग्रिम में धन्यवाद! :)


आप एक आदिम का उपयोग नहीं कर सकते क्योंकि हैश मैप कुंजी के लिए आंतरिक रूप से ऑब्जेक्ट का उपयोग करता है। तो आप केवल ऑब्जेक्ट से प्राप्त ऑब्जेक्ट का उपयोग कर सकते हैं (यह कोई ऑब्जेक्ट है)।

यह फ़ंक्शन हैश मैप में () है और जैसा कि आप देख सकते हैं कि यह ऑब्जेक्ट के लिए ऑब्जेक्ट का उपयोग करता है:

public V put(K key, V value) {
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key);
    int i = indexFor(hash, table.length);
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}

अभिव्यक्ति "k = e.key" को स्पष्ट करनी चाहिए।

मैं इंटीजर और ऑटोबॉक्सिंग जैसे रैपर का उपयोग करने का सुझाव देता हूं।


इसके बजाए Integer प्रयोग करें।

HashMap<Integer, MyObject> myMap = new HashMap<Integer, MyObject>();

जावा स्वचालित रूप से Integer ऑब्जेक्ट्स के लिए आपके int primitive मानों को स्वतः चालू कर देगा।

ओरेकल जावा दस्तावेज से autoboxing बारे में और पढ़ें।


उन सभी के लिए जो एंड्रॉइड डिवाइस के लिए जावा कोड करते हैं और यहां समाप्त होते हैं: बेहतर प्रदर्शन के लिए स्पैर्सएरे का उपयोग करें

private final SparseArray<myObject> myMap = new SparseArray<myObject>();

इसके साथ आप इंटीजर की बजाय int का उपयोग कर सकते हैं

int newPos = 3;

myMap.put(newPos, newObject);
myMap.get(newPos);

कृपया HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();


यदि आप एंड्रॉइड में कोड करते हैं, तो SparseArray , ऑब्जेक्ट के लिए पूर्णांक मैपिंग।


हैश मैप के साथ मुख्य कारण कुंजी के रूप में आदिम की इजाजत नहीं देता है कि हैश मैप को इस तरह से डिजाइन किया गया है कि चाबियों की तुलना करने के लिए, यह बराबर () विधि का उपयोग करता है, और एक विधि केवल एक वस्तु पर ही कहा जा सकता है जो आदिम पर नहीं है।

इस प्रकार जब इंटीजर को intoboxed है, हैशमैप इंटीजर ऑब्जेक्ट पर बराबर () विधि को कॉल कर सकता है।

यही कारण है कि, आपको int की बजाय इंटीजर का उपयोग करना चाहिए। मेरा मतलब है कि हैशप एक कुंजी के रूप में int रखते हुए एक त्रुटि फेंकता है (फेंकने वाली त्रुटि का अर्थ नहीं पता)

और यदि आपको लगता है कि, आप एक कुंजी के रूप में आदिम बनाकर मानचित्र प्रदर्शन को तेज़ी से बना सकते हैं, तो FastUtil नामक एक लाइब्रेरी है जिसमें एक प्रकार के रूप में int प्रकार के साथ एक मानचित्र कार्यान्वयन होता है।

इस वजह से, यह हैशमैप से बहुत तेज है







hashmap