2012-11-23 13 views

उत्तर

6

शायद यह कार्यान्वयन को देखने के लिए रोशन किया जाएगा:

private static class SetFromMap<E> extends AbstractSet<E> 
    implements Set<E>, Serializable 
{ 
    private final Map<E, Boolean> m; // The backing map 
    private transient Set<E> s;  // Its keySet 

    SetFromMap(Map<E, Boolean> map) { 
     if (!map.isEmpty()) 
      throw new IllegalArgumentException("Map is non-empty"); 
     m = map; 
     s = map.keySet(); 
    } 

    public void clear()    {  m.clear(); } 
    public int size()     { return m.size(); } 
    public boolean isEmpty()   { return m.isEmpty(); } 
    public boolean contains(Object o) { return m.containsKey(o); } 
    public boolean remove(Object o) { return m.remove(o) != null; } 
    public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; } 
    public Iterator<E> iterator()  { return s.iterator(); } 
    public Object[] toArray()   { return s.toArray(); } 
    public <T> T[] toArray(T[] a)  { return s.toArray(a); } 
    public String toString()   { return s.toString(); } 
    public int hashCode()    { return s.hashCode(); } 
    public boolean equals(Object o) { return o == this || s.equals(o); } 
    public boolean containsAll(Collection<?> c) {return s.containsAll(c);} 
    public boolean removeAll(Collection<?> c) {return s.removeAll(c);} 
    public boolean retainAll(Collection<?> c) {return s.retainAll(c);} 
    // addAll is the only inherited implementation 

    private static final long serialVersionUID = 2454657854757543876L; 

    private void readObject(java.io.ObjectInputStream stream) 
     throws IOException, ClassNotFoundException 
    { 
     stream.defaultReadObject(); 
     s = m.keySet(); 
    } 
} 

संपादित करें - जोड़ा स्पष्टीकरण:

नक्शा है कि आप प्रदान करते हैं इस वस्तु में m क्षेत्र के रूप में प्रयोग किया जाता है।

जब आप सेट में e तत्व जोड़ते हैं, तो यह मानचित्र में e -> true प्रविष्टि जोड़ता है।

public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; } 

तो इस वर्ग के अपने Map एक वस्तु है कि बस मूल्यों है कि चीजें करने के लिए मैप की जाती हैं अनदेखी, और सिर्फ कुंजियों का उपयोग करके एक Set तरह बर्ताव करता है में बदल जाता है।

+0

कृपया, कुछ स्पष्टीकरण –

+0

मेरा मुख्य सवाल सेट का समर्थन कर रहा है जोड़ सकते हैं और नक्शा .. आप उन्हें से क्या मतलब है और एक साधारण उदाहरण उपयोगी होगा .. – Heggi

+0

धन्यवाद @ क्रिस्टोफर मार्टिन ... – Heggi

0

सेट आंतरिक रूप से मूल्यों को संग्रहीत करने के लिए मानचित्र का उपयोग करता है। यहां बैकिंग मैप सेट मैप को संदर्भित करता है जिसे आंतरिक रूप से सेट द्वारा उपयोग किया जाता है। अधिक जानकारी के लिए । http://www.jusfortechies.com/java/core-java/inside-set.php

1
सीधे शब्दों में कहें

, Collections.newSetFromMapSet<E> तत्वों स्टोर करने के लिए प्रदान की Map<E> कार्यान्वयन उपयोग करता है।

2

मैं बस के लिए एक उदाहरण कोड बनाया आप

HashMap<String, Boolean> map = new HashMap<String, Boolean>(); 

Set<String> set = Collections.newSetFromMap(map); 

System.out.println(set); 

for (int i = 0; i < 10; i++) 
    map.put("" + i, i % 2 == 0); 

System.out.println(map); 

System.out.println(set); 

और आउटपुट

[] 
{3=false, 2=true, 1=false, 0=true, 7=false, 6=true, 5=false, 4=true, 9=false, 8=true} 
[3, 2, 1, 0, 7, 6, 5, 4, 9, 8] 
+0

जावाडोक से: इस विधि को मानचित्र क्रियान्वयन पर उपयोग करने की आवश्यकता नहीं है जिसमें पहले से ही एक सेट सेट कार्यान्वयन (जैसे हैश मैप या ट्रीमैप) है। – Jasper

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