2012-09-14 27 views
7

मेरे पास SortedMap है, इसकी चाबियों के प्राकृतिक क्रम के अनुसार आदेश दिया गया है। क्या मैं अपने कुंजीसेट() को SortedSet पर सुरक्षित रूप से अमान्य कास्ट अपवाद को खतरे में डाल सकता हूं।क्या सॉर्ट किए गए मैप की keySet() हमेशा सॉर्टेडसेट पर सुरक्षित रूप से डाली जा सकती है?

यही है, निम्नलिखित फेंक देंगे?

SortedMap<K, V> map = ...; 
SortedSet<K> set = (SortedSet<K>) map.keySet(); 

जवाब "SortedMap के कार्यान्वयन पर निर्भर करता है" है, तो कम से कम यह एक TreeMap के लिए सुरक्षित है?

+0

उन सभी के लिए जो "दस्तावेज में गारंटी नहीं देते" लिखते हैं, मुझे बताएं कि सॉर्टेडसेट की कीसेट() के लिए प्रलेखन कहता है "सेट का इटरेटर आरोही क्रम में कुंजी देता है।" तो भले ही यह "सॉर्टेडसेट" नहीं है, यह एक सेट है जो सॉर्ट किया गया है ... –

+1

प्रैक्टिस में यह ** एक सॉर्टेडसेट है। लेकिन सिद्धांत रूप में, जब तक यह निर्दिष्ट नहीं किया जाता है, इसे (उदाहरण के लिए, एक नया सॉर्टेडसेट नहीं है जो कि आंतरिक कुंजी सेट पुनरावृत्ति के लिए बनाया जा सकता है - माना जाता है कि यह बेवकूफ होगा)। – assylias

+0

सुधार: यहां तक ​​कि अभ्यास में, यह हमेशा एक सॉर्टसेटसेट नहीं है जैसा कि उत्तर में से एक द्वारा इंगित किया गया है। काउंटर उदाहरण के लिए – assylias

उत्तर

12

सामान्य रूप से SortedMap के लिए, जैसा कि यह जावाडोक में प्रलेखित नहीं है।

हालांकि, TreeMap भी लागू करता NavigableMap है, जो एक कुंजी सेट के रूप में एक NavigableSet उपयोग करता है और NavigableSetSortedSet फैली ...

तो तुम क्या कर सकते हैं:

NavigableMap<K, V> map = ...; //can be a TreeMap or a ConcurrentSkipListMap 
SortedSet<K> set = map.navigableKeySet(); 
4

यह देखते हुए कि प्रलेखन की गारंटी नहीं है कि यह एक SortedSet हो जाएगा, भले ही वर्तमान कार्यान्वयन इसे उस तरह से लागू करने के लिए (और मैं जाँच नहीं की है कि वे करते हैं), यह मतलब नहीं है कि यह कुछ तुम हो मानना ​​चाहिए

1

नहीं यह बाद से सुरक्षित नहीं है दस्तावेज यह नहीं कहता है। यह हालांकि सुरक्षित होना चाहिए:

SortedSet<K> set = new TreeSet<K>(map.keySet());

8
SortedMap<String, String> treeMap = new TreeMap<String, String>(); 
// prints true 
System.out.println(treeMap.keySet() instanceof SortedSet); 
// prints false 
System.out.println(Collections.synchronizedSortedMap(treeMap).keySet() instanceof SortedSet); 

तो जवाब नहीं है।

TreeMap.keySet()SortedSet देता है, लेकिन यह जावाडोक द्वारा गारंटी नहीं है।

NavigableMap इंटरफ़ेस है, जो SortedMap फैली हुई है, एक navigableSet() विधि है, जो एक NavigableSet, जो SortedSet फैली returs, हालांकि है।

+1

+1! – assylias