जावा - नई एंट्री कैसे बनाएं (कुंजी, मूल्य)


291

मैं नया आइटम है कि इसी तरह के बनाना चाहते हैं जो Util.Map.Entryकि संरचना में शामिल होंगे key, value

समस्या यह है कि मैं तुरंत नहीं कर सकता Map.Entryक्योंकि यह एक इंटरफ़ेस है।

क्या कोई जानता है कि Map.Entry के लिए एक नई सामान्य कुंजी / मान ऑब्जेक्ट कैसे बनाया जाए?

जवाबों:


79

आप Map.Entry<K, V>इंटरफ़ेस को स्वयं लागू कर सकते हैं :

import java.util.Map;

final class MyEntry<K, V> implements Map.Entry<K, V> {
    private final K key;
    private V value;

    public MyEntry(K key, V value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public K getKey() {
        return key;
    }

    @Override
    public V getValue() {
        return value;
    }

    @Override
    public V setValue(V value) {
        V old = this.value;
        this.value = value;
        return old;
    }
}

और फिर इसका उपयोग करें:

Map.Entry<String, Object> entry = new MyEntry<String, Object>("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());

117
बेशक - मुझे आश्चर्य है कि अगर वहाँ के लिए बॉक्स समाधान नहीं है। मैं अपने कोड को यथासंभव मानक बनाने की कोशिश कर रहा हूं ...
स्पाइडरमैन

1
क्या आप यह बता सकते हैं कि मानचित्र के कुछ कार्यान्वयनों में फ़ाइनल के समान कुंजी (जैसे हाशप, कॉनकरेन्शहैश मैप) क्यों है, लेकिन कुछ अन्य ट्रीप्लेमेंट्स जैसे वीकहैप्स, वीकहाशपैप?
एकेएस

7
दिए गए कोड पूरी तरह से सही नहीं हैं क्योंकि यह समतुल्य और हैशकोड को ओवरराइड नहीं करता है जो कि इंटरफ़ेस द्वारा आवश्यक है। मैप करें
जॉन तांग

जावा 7 अपडेट 80 के रूप में, मैंने ऊपर लागू किया है और इसने ( पास्टबिन ) काम किया है । किसी अन्य तरीके की अति नहीं थी।
चांदी

807

वहाँ है public static class AbstractMap.SimpleEntry<K,V>Abstractनाम का हिस्सा आपको गुमराह न करें: यह वास्तव में एक वर्ग नहीं हैabstract (लेकिन इसका शीर्ष-स्तर AbstractMapहै)।

तथ्य यह है कि यह एक staticनेस्टेड वर्ग है इसका मतलब है कि आपको इसे तुरंत करने के लिए एक संलग्न उदाहरण की आवश्यकता नहींAbstractMap है, इसलिए इस तरह का कुछ ठीक है:

Map.Entry<String,Integer> entry =
    new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);

जैसा कि एक अन्य जवाब में कहा गया है, अमरूद में एक सुविधाजनक staticकारखाना विधि भी है Maps.immutableEntryजिसका आप उपयोग कर सकते हैं।


तुमने कहा था:

मैं Map.Entryस्वयं का उपयोग नहीं कर सकता क्योंकि स्पष्ट रूप से यह केवल पढ़ने-योग्य वस्तु है जिसे मैं नया नहीं कर सकताinstanceof

यह पूरी तरह से सही नहीं है। इसका कारण यह है कि आप इसे सीधे नहीं कर सकते (यानी के साथ new) क्योंकि यह एक है interface Map.Entry


कैविएट और टिप

जैसा कि प्रलेखन में उल्लेख किया गया AbstractMap.SimpleEntryहै @since 1.6, इसलिए यदि आप 5.0 से अटके हुए हैं, तो यह आपके लिए उपलब्ध नहीं है।

एक अन्य ज्ञात वर्ग की तलाश करने के लिए implements Map.Entry, आप वास्तव में सीधे जावाडॉक जा सकते हैं। से जावा 6 संस्करण

इंटरफ़ेस मानचित्र

सभी ज्ञात कार्यान्वयन कक्षाएं :

दुर्भाग्य से 1.5 संस्करण किसी भी ज्ञात कार्यान्वयन वर्ग को सूचीबद्ध नहीं करता है जिसका आप उपयोग कर सकते हैं, इसलिए आप अपने स्वयं के कार्यान्वयन के साथ फंस सकते हैं।


उपरोक्त पंक्ति मेरे लिए संकलन त्रुटि देता है (मैं जावा 5, बीटीडब्ल्यू का उपयोग कर रहा हूं) - त्रुटि संदेश है: 'प्रकार AbstractMap.SimpleEntry दिखाई नहीं देता है'
स्पाइडरमैन

6
क्योंकि AbstractMap.SimpleEntryजावा 6 तक यह सार्वजनिक नहीं था, जैसा कि आप प्रलेखन में देख सकते हैं।
जेस्पर

ठीक है, इसलिए संक्षिप्त चर्चा को संक्षेप में प्रस्तुत करने के लिए - जावा 5 में इसका कोई आउट-ऑफ-द-बॉक्स समाधान नहीं है - मुझे इसे अपने स्वयं के कार्यान्वयन का उपयोग करना चाहिए।
स्पाइडरमैन

4
इशारा करने के लिए +1 AbstractMap.SimpleEntry। मुझे लगता है तुम रोज कुछ नया सीखते हो!
प्रियादु नीमरे

"एनकोडिंग एंज़ाउट स्पास्ट उदाहरण" में संलग्न होने से आपका क्या मतलब है। Enclosing एक तकनीकी शब्द या जावा में कुछ का उल्लेख है? कृपया मेरा मार्ग दर्शन कीजिए।
C ग्राफिक्स

70

जावा 9 से शुरू , एक नई उपयोगिता विधि है जो एक अपरिवर्तनीय प्रविष्टि बनाने की अनुमति देती है Map#entry(Object, Object)

ये रहा एक सरल उदाहरण:

Entry<String, String> entry = Map.entry("foo", "bar");

जैसा कि यह अपरिवर्तनीय है, कॉलिंग setValueएक फेंक देगा UnsupportedOperationException। अन्य सीमाएं इस तथ्य की हैं कि यह क्रमबद्ध नहीं है और nullजैसा कि कुंजी या मूल्य निषिद्ध है, यदि यह आपके लिए स्वीकार्य नहीं है, तो आपको उपयोग करने AbstractMap.SimpleImmutableEntryया AbstractMap.SimpleEntryइसके बजाय की आवश्यकता होगी ।

नायब: यदि आपकी आवश्यकता Map0 से 10 तक (कुंजी, मूल्य) जोड़े के साथ सीधे बनाने की है , तो आप इसके प्रकार के तरीकों का उपयोग कर सकते हैं Map.of(K key1, V value1, ...)



34

AbstractMap.SimpleEntry का उदाहरण:

import java.util.Map; 
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;

दृष्टांत:

ArrayList<Map.Entry<Integer, Integer>> arr = 
    new ArrayList<Map.Entry<Integer, Integer>>();

पंक्तियाँ जोड़ें:

arr.add(new AbstractMap.SimpleEntry(2, 3));
arr.add(new AbstractMap.SimpleEntry(20, 30));
arr.add(new AbstractMap.SimpleEntry(2, 4));

फ़ेच पंक्तियाँ:

System.out.println(arr.get(0).getKey());
System.out.println(arr.get(0).getValue());
System.out.println(arr.get(1).getKey());
System.out.println(arr.get(1).getValue());
System.out.println(arr.get(2).getKey());
System.out.println(arr.get(2).getValue());

प्रिंट करना चाहिए:

2
3
20
30
2
4

यह ग्राफ संरचनाओं के किनारों को परिभाषित करने के लिए अच्छा है। अपने सिर में न्यूरॉन्स के बीच की तरह।


18

आप वास्तव में साथ जा सकते हैं: Map.Entry<String, String> en= Maps.immutableEntry(key, value);


येह काम का है। github.com/google/guava Guava Google का कोर जावा लाइब्रेरी का एक सेट है जिसमें नए संग्रह प्रकार (जैसे मल्टीमैप और मल्टीसेट), अपरिवर्तनीय संग्रह, एक ग्राफ़ लाइब्रेरी और संगामिति के लिए उपयोगिताओं, I / O, हैशिंग, कैशिंग शामिल हैं आदिम, तार, और अधिक! यह व्यापक रूप से Google के भीतर अधिकांश जावा परियोजनाओं पर उपयोग किया जाता है, और व्यापक रूप से कई अन्य कंपनियों द्वारा भी उपयोग किया जाता है।
लिंगोगुआंग

13

क्यों Map.Entry? मुझे लगता है कि केस के लिए की-वैल्यू जोड़ी फिट है।

का उपयोग करें java.util.AbstractMap.SimpleImmutableEntryयाjava.util.AbstractMap.SimpleEntry


6

org.apache.commons.lang3.tuple.Pairऔजार java.util.Map.Entryऔर स्टैंडअलोन का भी उपयोग किया जा सकता है।

जैसा कि दूसरों ने अमरूद का जिक्र किया है com.google.common.collect.Maps.immutableEntry(K, V)

मैं Pairइसके धाराप्रवाह Pair.of(L, R)सिंटैक्स के लिए पसंद करता हूं ।


2
क्या मैं ImmutablePairइसके बजाय सुझाव दूंगा?
बेलुचिन

मुझे वास्तव में org.apache.commons.lang3.tuple.Pair क्लास पसंद है, यह बहुत बढ़िया है!
लॉरेंस ओप Zandt

केवल एक चीज जो मुझे पसंद नहीं है वह यह है कि यह बाएं, दाएं, कुंजी, मूल्य पर क्रमबद्ध हो जाती है, जहां बाएं = कुंजी और दाएं = मूल्य। क्रमबद्ध स्ट्रिंग में सिर्फ 2 अतिरिक्त बेकार (शायद) मान।
विक्रांत गोयल

4

मैंने एक सामान्य जोड़ी वर्ग को परिभाषित किया जिसका मैं हर समय उपयोग करता हूं। यह बहुत अच्छा है। एक स्थिर कारखाने विधि (Pair.create) को परिभाषित करते हुए एक बोनस के रूप में, मुझे केवल टाइप तर्कों को अक्सर लिखना होगा।

public class Pair<A, B> {

    private A component1;
    private B component2;

    public Pair() {
            super();
    }

    public Pair(A component1, B component2) {
            this.component1 = component1;
            this.component2 = component2;
    }

    public A fst() {
            return component1;
    }

    public void setComponent1(A component1) {
            this.component1 = component1;
    }

    public B snd() {
            return component2;
    }

    public void setComponent2(B component2) {
            this.component2 = component2;
    }

    @Override
    public String toString() {
            return "<" + component1 + "," + component2 + ">";
    }

    @Override
    public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result
                            + ((component1 == null) ? 0 : component1.hashCode());
            result = prime * result
                            + ((component2 == null) ? 0 : component2.hashCode());
            return result;
    }

    @Override
    public boolean equals(Object obj) {
            if (this == obj)
                    return true;
            if (obj == null)
                    return false;
            if (getClass() != obj.getClass())
                    return false;
            final Pair<?, ?> other = (Pair<?, ?>) obj;
            if (component1 == null) {
                    if (other.component1 != null)
                            return false;
            } else if (!component1.equals(other.component1))
                    return false;
            if (component2 == null) {
                    if (other.component2 != null)
                            return false;
            } else if (!component2.equals(other.component2))
                    return false;
            return true;
    }

    public static <A, B> Pair<A, B> create(A component1, B component2) {
            return new Pair<A, B>(component1, component2);
    }

}

1
क्षमा करें, मैंने अन्य सभी टिप्पणियों को पढ़ने से पहले यह पोस्ट किया है। लगता है कि आप कुछ ऐसा चाहते हैं जो मानक लिब में शामिल हो ...
नेल्स बेकमैन

2
Google अमरूद इस बात का एक अच्छा बिंदु है कि क्यों Pairकार्यान्वयन एक बुरी चीज है। स्रोत
इंगो बुर्क

3

यदि आप क्लोज़र का उपयोग कर रहे हैं, तो आपके पास एक और विकल्प है:

(defn map-entry
  [k v]
  (clojure.lang.MapEntry/create k v))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.