2009-02-24 15 views
202

मैं Apache Collections लाइब्रेरी से TreeBidiMap का उपयोग कर रहा हूं। मैं इसे doubles मानों पर सॉर्ट करना चाहता हूं।संग्रह में सूची को कैसे परिवर्तित करें?

मेरे विधि का उपयोग कर मूल्यों की एक Collection को पुनः प्राप्त करने के लिए है:

Collection coll = themap.values(); 

कौन सा स्वाभाविक रूप से ठीक काम करता है।

मुख्य प्रश्न: मैं अब पता है कि कैसे मैं एक List में डाली (यकीन नहीं है जो सही है) coll परिवर्तित कर सकते हैं/तो यह छाँटा जा सकता है करना चाहते हैं?

मैं तो हल कर List वस्तु है, जो क्रम में हो सकता है और जहां इटरेटर doubles की सूची पर हो जाएगा TreeBidiMap (themap) से उचित कुंजी themap.getKey(iterator.next()) का उपयोग कर मिलना चाहिए से अधिक पुनरावृति करना चाहते हैं।

+4

आप सीधे SortedMap किसी तरह का उपयोग करके इस कदम से बचने के लिए चाहते हो सकता है, इसलिए प्रविष्टियों में चाबियों का प्राकृतिक व्यवस्था इस्तेमाल किया जा रहा है। जावा का अपना ट्रीमैप सॉर्टेड मैप लागू करता है। –

+0

'TreeBidiMap' एक 'ऑर्डरर्ड मैप' है, ऑर्डर ठीक होना चाहिए। प्रश्न में आवश्यक सॉर्टिंग मूल्यों पर है, चाबियों पर नहीं। – Vlasec

उत्तर

365
List list = new ArrayList(coll); 
Collections.sort(list); 

जैसा कि एरल सेगल हैलेवी नीचे कहते हैं, अगर कॉल पहले से ही एक सूची है, तो आप चरण एक को छोड़ सकते हैं। लेकिन यह TreeBidiMap के आंतरिक पर निर्भर करेगा।

List list; 
if (coll instanceof List) 
    list = (List)coll; 
else 
    list = new ArrayList(coll); 
+1

बस ध्यान दें कि दो दृष्टिकोणों के लिए अलग-अलग दुष्प्रभाव हैं: संग्रह को सूची में कास्ट करना और फिर सॉर्टिंग मूल संग्रह को भी सॉर्ट करेगा; एक प्रतिलिपि बनाना नहीं होगा। – Barney

+0

यह दृष्टिकोण बार-बार उपयोग किए जाने पर प्रदर्शन को बहुत कम करता है। एक समाधान के लिए मेरा उत्तर देखें जो फ्लाई पर काम करता है, इसमें एक कस्टम संग्रह शामिल है। – Vlasec

58

कुछ इस तरह काम करना चाहिए, ArrayList constructor है कि एक संग्रह लेता बुला:

List theList = new ArrayList(coll); 
7
Collections.sort(new ArrayList(coll)); 
+0

ArrayList तक पहुंचने के लिए एक संदर्भ गुम है? –

+0

@Zach: mmhh अच्छा बिंदु। मुझे पता था कि सीडब्ल्यू के रूप में इसे चिह्नित करने का मेरा कारण था। बीटीडब्ल्यू पॉल का जवाब एक है। मुझे नहीं पता कि उसके पास केवल मेरा यूवी क्यों है। – OscarRyz

29

मुझे लगता है कि पॉल Tomblin के जवाब मामला coll में बेकार हो सकता है एक सूची पहले से ही है, क्योंकि यह होगा एक नई सूची बनाएं और सभी तत्वों की प्रतिलिपि बनाएँ। अगर कॉल में कई गहने होते हैं, तो इसमें काफी समय लग सकता है।

मेरे सुझाव है:

List list; 
if (coll instanceof List) 
    list = (List)coll; 
else 
    list = new ArrayList(coll); 
Collections.sort(list); 
4

@Kunigami: मैं तुम्हें अमरूद के newArrayList विधि के बारे में गलत हो सकता है लगता है। यह जांच नहीं करता है कि इटेरेबल एक सूची प्रकार है या बस दी गई सूची को वापस लौटाएं।

@GwtCompatible(serializable = true) 
public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) { 
    checkNotNull(elements); // for GWT 
    // Let ArrayList's sizing logic work, if possible 
    return (elements instanceof Collection) 
     ? new ArrayList<E>(Collections2.cast(elements)) 
     : newArrayList(elements.iterator()); 
} 
+0

यह कैसे अधिक वोट नहीं दिया गया है? कुनीगामी का जवाब गलत है (जहां तक ​​यह अंतर्निहित कार्यान्वयन के बारे में लगता है)। – GreenieMeanie

-1

यहाँ एक एक लाइनर के रूप में एक उप इष्टतम समाधान है:: यह हमेशा एक नई सूची बनाता है

Collections.list(Collections.enumeration(coll)); 
1

क्या आप अनुरोध है काफी costy आपरेशन, सुनिश्चित करें कि आप डॉन बना ' इसे अक्सर करने की आवश्यकता नहीं है (उदाहरण के लिए एक चक्र में)।

अन्यथा, आप एक कस्टम संग्रह बना सकते हैं। मैं उस व्यक्ति के साथ आया जिसकी हूड के नीचे TreeBidiMap और TreeMultiset है। केवल उन्हीं को लागू करें जो आपको चाहिए और डेटा अखंडता की परवाह करें।

class MyCustomCollection implements Map<K, V> { 
    TreeBidiMap<K, V> map; 
    TreeMultiset<V> multiset; 
    public V put(K key, V value) { 
     removeValue(map.put(key, value)); 
     multiset.add(value); 
    } 
    public boolean remove(K key) { 
     removeValue(map.remove(key)); 
    } 
    /** removes value that was removed/replaced in map */ 
    private removeValue(V value) { 
     if (value != null) { 
      multiset.remove(value); 
     } 
    } 
    public Set keySet() { 
     return map.keySet(); 
    } 
    public Multiset values() { 
     return multiset; 
    } 
    // many more methods to be implemented, e.g. count, isEmpty etc. 
} 

इस तरह, आप एक अनुसार क्रमबद्धMultisetvalues() से लौटे है। हालांकि, अगर आपको इसकी सूची होने की आवश्यकता है (उदा। आपको सरणी की तरह get(index) विधि की आवश्यकता है), तो आपको कुछ और जटिल खोजना होगा।

4

मेरा मानना ​​है कि आप इस तरह के रूप में यह लिख सकते हैं:

coll.stream().collect(Collectors.toList()) 
+0

कास्टिंग के आसपास पाने के लिए बेहतर तरीका – Stackee007

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

  • कोई संबंधित समस्या नहीं^_^