2010-11-18 15 views
5

मैं ऐसी ऑब्जेक्ट रखना चाहता हूं जो जावा में मानचित्र और सूची इंटरफेस दोनों लागू करे। विचार इस सवाल में समस्या के समान है: Java Ordered Mapजावा में मानचित्र और सूची इंटरफ़ेस दोनों लागू करें?

मैं एक सूची में नाम/मान युग्म जोड़ सकते हैं और सूची अनुक्रम की रक्षा की है, लेकिन यह भी नाम से खोज के ऐसा करने में सक्षम होना चाहता हूँ:

foo.put("name0", "value0"); 
foo.put("name1", "value1"); 
foo.get(1); --> Map.Entry("name1", "value1") 
foo.get("name0"); --> "value0" 

यहाँ समस्या है: जब मैं इस वर्ग बनाने के लिए:

"The return type is incompatible with Map.remove(Object)" 
public boolean remove(Object o) { 
    return false; 
} 
:

class Foo implements Map, List { 
    // add all methods here 
} 

मैं एक संकलन त्रुटि मिलती है

यदि मैं मानचित्र और सूची इंटरफेस को लागू नहीं करता हूं, तो ऐसे कई जावा संग्रह विधियां हैं जो इस डेटा संरचना पर उपयोग करने के लिए उपलब्ध नहीं हैं।

(इसके अलावा, कारण यह है कि समाधान जावा में प्रस्तावित मानचित्र आदेश दिया से काम नहीं होता LinkedHashMap एक get (int) विधि नहीं है कि। सूचकांक द्वारा प्रविष्टियों नहीं चुना जा सकता है।)

+2

क्या आप 'लिंक्ड हैशमैप' को विस्तारित करने के खिलाफ हैं, यदि नहीं, तो 'get (int)' विधि को जोड़ने का प्रयास क्यों न करें? –

+0

http://www.java.net/forum/topic/jdk/java-se/implementing-both-map-and-list-impossible-0 – Adam

+1

@ एडम कि लिंक टूटा हुआ है, लेकिन मुझे लगता है कि हम जानते हैं कि हम क्या जानते हैं यह कहता है, सिर्फ यूआरएल से;) – MatrixFrog

उत्तर

5

क्या आप दोनों List और Map एक ही कक्षा पर लागू नहीं कर सकते देखा के रूप में। लेकिन जिस चीज की आपको आवश्यकता है उसके लिए भी जरूरी नहीं होना चाहिए। आपको क्या चाहिए कि data को Map और List इंटरफ़ेस दोनों द्वारा एक्सेस किया जा सकता है। Map डेटा entrySet() में सेट के रूप में या Map.values() का उपयोग करके संग्रह के रूप में डेटा की तरह थोड़ा सा।

संक्षेप में, आपको डेटा पर 2 विचारों की आवश्यकता है, List को लागू करने वाला एक दृश्य और Map लागू करने वाला एक और दृश्य।

यदि कोई दृश्य प्रभावशाली है (उदाहरण के लिए मानचित्र) तो आप अपना नक्शा कार्यान्वयन एक विधि List getAsList() दे सकते हैं जो डेटा के डेटा द्वारा समर्थित सूची के रूप में डेटा प्रस्तुत करता है।

संपादित

जवाब पाउलो Guedes द्वारा दिए गए आप की सेवा करनी चाहिए। आपकी आवश्यकताओं के साथ पहले से ही एक मानचित्र कार्यान्वयन है। मेरा जवाब थोड़ा अधिक सामान्य है, एक ही डेटा को कई असंगत इंटरफेस का उपयोग करके प्रस्तुत करना जहां एक साधारण एडाप्टर पर्याप्त नहीं है।

5

LinkedHashMap जो आपको चाहिए

अनुमानित पुनरावृत्ति आदेश के साथ, मैश इंटरफ़ेस की हैश तालिका और लिंक सूची सूची कार्यान्वयन। यह कार्यान्वयन हैश मैप से अलग है जिसमें यह अपनी सभी प्रविष्टियों के माध्यम से चलने वाली दोगुनी-लिंक्ड सूची बनाए रखता है।

+0

इंडेक्स – Adam

+2

@Adam द्वारा आइटम प्राप्त करने के लिए कोई 'get' विधि नहीं है: फिर LinkedHashMap का विस्तार करें और इटरेटर का उपयोग करके प्राप्त करें (int अनुक्रमणिका)। आप 'टेबल' नामक बैकिंग एंट्री [] सरणी का भी उपयोग कर सकते हैं (हालांकि मैं मजबूती के लिए इटरेटर का उपयोग करता हूं)। – extraneon

1

Map और List इंटरफेस में remove विधि की विरोधाभासी परिभाषाएं शामिल हैं। आप एक ही कक्षा में दोनों को लागू नहीं कर सकते हैं क्योंकि आप केवल उसी प्रकार के हस्ताक्षर को ओवरराइड नहीं कर सकते हैं, केवल रिटर्न प्रकार में अंतर के साथ।

मुझे आश्चर्य है कि List<Map.Entry<K,V>> का उपयोग करने से आपकी आवश्यकता पूरी हो जाएगी।

5

यह बताया जाना चाहिए कि त्रुटि के लिए कारण यह है कि Map निम्नलिखित remove विधि के लिए परिभाषा में शामिल है: एक ओर जहां List को परिभाषित करता है

V remove(Object key) 

:

boolean remove(Object o) 

और, जावा में, विधियों को उनके रिटर्न प्रकार के आधार पर ओवरलोड नहीं किया जा सकता है, इसलिए वे विरोधाभासी हस्ताक्षर हैं, और उसी कक्षा में लागू नहीं किए जा सकते हैं।

2

आप अपना इंटरफ़ेस क्यों लागू नहीं करते?

public interface HashListMap { 

public boolean add(Object arg0); 
public void add(int arg0, Object arg1); 
public boolean addAll(Collection arg0); 
public boolean addAll(int arg0, Collection arg1); 
public void clear(); 
public boolean contains(Object arg0); 
public boolean containsAll(Collection arg0); 
public Object get(int arg0); 
public int indexOf(Object arg0); 
public boolean isEmpty(); 
public Iterator iterator(); 
public int lastIndexOf(Object arg0); 
public ListIterator listIterator(); 
public ListIterator listIterator(int arg0); 
public boolean remove(Object arg0); 
public Object remove(int arg0); 
public boolean removeAll(Collection arg0); 
public boolean retainAll(Collection arg0); 
public Object set(int arg0, Object arg1); 
public int size(); 
public List subList(int arg0, int arg1); 
public Object[] toArray(); 
public Object[] toArray(Object[] arg0); 
public boolean containsKey(Object arg0); 
public boolean containsValue(Object arg0); 
public Set entrySet(); 
public Object get(Object arg0); 
public Set keySet(); 
public Object put(Object arg0, Object arg1); 
public void putAll(Map arg0); 
public Collection values(); 

}

+2

+1 हास्य की भावना के लिए –

+0

बहुत मजाकिया :) "कभी समर्थित नहीं" इंटरफ़ेस का उपयोग करने का क्या मतलब है? – Donatello

1

क्या डेव कोस्टा ने कहा कि आप LinkedHashMap का उपयोग करना चाहिए के अलावा। यह मानचित्र है लेकिन यह तत्व सम्मिलन के क्रम को संरक्षित करता है।

मानचित्र के रूप में यह मान() विधि लागू करता है, तो आप नई ArrayList (map.values ​​()) कह सकते हैं। (0) सूची कार्यक्षमता नकल करने के लिए प्राप्त करें।

लेकिन आप map.get ("एक") कह सकते हैं क्योंकि यह सिर्फ एक नक्शा कार्यान्वयन है।

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