2016-09-11 12 views
13

वहाँ किसी भी तरह से है कि मैं की तरह एक Map वस्तु के लिए एक पूरी Entry वस्तु डाल सकता है?एक मानचित्र में प्रवेश कैसे करें?</p> <pre><code>map.put(key,value); </code></pre> <p>: बजाय की तरह एक कुंजी-मान पेयर पास करने का</p> <pre><code>map.put(entry); </code></pre> <p>:

+1

एक कारण 'map.put (entry.getKey(), entry.getValue())' असंतोषजनक है? – ajb

+4

क्योंकि 'map.put (entry.getKey(), entry.getValue())' निरर्थक है और हो सकता है सिर्फ 'map.put (प्रवेश)' जो अधिक संक्षिप्त और पढ़ी जा सकती है कम कर दिया। मेरी राय भी में, वहाँ एक 'वी पुट (एंट्री प्रविष्टि)' विधि '' java.util' पैकेज के Map' इंटरफेस में होना चाहिए। – pgmank

+1

_When_ आपको ऐसी विधि की आवश्यकता होगी - उपयोग केस क्या होगा? मुझे लगता है कि एपीआई में नहीं है, क्योंकि [YAGNI] (https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it)। –

उत्तर

3

मैं मानचित्र इंटरफ़ेस तरीकों की खोज नहीं की लेकिन कोई विधि है कि एक प्रवेश लेता है और नक्शे में कहते है। इसलिए मैंने थोड़ा सा विरासत और जावा 8 इंटरफेस का उपयोग करके इसे लागू किया है।

import java.util.AbstractMap; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.TreeMap; 

public class Maps { 

    // Test method 
    public static void main(String[] args) { 
     Map.Entry<String, String> entry1 = newEntry("Key1", "Value1"); 
     Map.Entry<String, String> entry2 = newEntry("Key2", "Value2"); 

     System.out.println("HashMap"); 
     MyMap<String, String> hashMap = new MyHashMap<>(); 
     hashMap.put(entry1); 
     hashMap.put(entry2); 

     for (String key : hashMap.keySet()) { 
      System.out.println(key + " = " + hashMap.get(key)); 
     } 

     System.out.println("\nTreeMap"); 
     MyMap<String, String> treeMap = new MyTreeMap<>(); 
     treeMap.put(entry1); 
     treeMap.put(entry2); 


     for (String key : treeMap.keySet()) { 
      System.out.println(key + " = " + treeMap.get(key)); 
     } 
    } 


    /** 
    * Creates a new Entry object given a key-value pair. 
    * This is just a helper method for concisely creating a new Entry. 
    * @param key key of the entry 
    * @param value value of the entry 
    * 
    * @return the Entry object containing the given key-value pair 
    */ 
    private static <K,V> Map.Entry<K,V> newEntry(K key, V value) { 
     return new AbstractMap.SimpleEntry<>(key, value); 
    } 

    /** 
    * An enhanced Map interface. 
    */ 
    public static interface MyMap<K,V> extends Map<K,V> { 

     /** 
     * Puts a whole entry containing a key-value pair to the map. 
     * @param entry 
     */ 
     public default V put(Entry<K,V> entry) { 
      return put(entry.getKey(), entry.getValue()); 
     } 
    } 

    /** 
    * An enhanced HashMap class. 
    */ 
    public static class MyHashMap<K,V> extends HashMap<K,V> implements MyMap<K,V> {} 

    /** 
    * An enhanced TreeMap class. 
    */ 
    public static class MyTreeMap<K,V> extends TreeMap<K,V> implements MyMap<K,V> {} 
} 

MyMap इंटरफेस सिर्फ एक अंतरफलक है कि एक और विधि, public default V put(Entry<K,V> entry) जोड़कर Map इंटरफ़ेस फैली हुई है। अलावा सिर्फ विधि को परिभाषित करने से, एक डिफ़ॉल्ट कार्यान्वयन भी कोडित है। ऐसा करने से, हम MyMap इंटरफ़ेस लागू करने और हमारी पसंद के मानचित्र कार्यान्वयन वर्ग को विस्तारित करने वाली नई कक्षा को परिभाषित करके इंटरफ़ेस लागू करने वाले किसी भी वर्ग में इस विधि को जोड़ सकते हैं। एक ही पंक्ति में सभी ! यह जहां दो कक्षाएं प्रत्येक HashMap और ट्री-मैप कार्यान्वयन विस्तार बनाई गई हैं इसके बाद के संस्करण कोड के तल में प्रदर्शित किया गया है।

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