2012-08-28 14 views
6

मैं android.util.SparseArray कैसे सॉर्ट कर सकता हूं? ईजी। मैं के साथ SparseArray है:
1 - 2.33
5 - 1.5
परिणाम:
5 - 1.5
1 - 2.33एंड्रॉइड में स्पैर्सएरे को सॉर्ट करें

धन्यवाद !!!

- संपादित

मैंने मानचित्र का उपयोग किया है। मदद के लिए धन्यवाद।

+2

आप इसे सुलझाने के लिए क्यों चाहिए? कुंजी बदलती नहीं हैं और 'स्पैरएरे' 'Iterable' लागू नहीं करती है। – nkr

+2

'Iterable' इतना मुद्दा नहीं है, लेकिन मैं इस बात से सहमत हूं कि यदि लक्ष्य इस डेटा संरचना को हल करना है, तो सामान्य जावा डेटा संरचनाएं जैसे 'मानचित्र' के उप-वर्ग की तरह अधिक समझदारी होगी। यह नहीं कहना है कि आप 'स्पेयरएरे' को वांछित तरीके से सॉर्ट नहीं कर सकते हैं, लेकिन यह आउट ऑफ़ द बॉक्स समाधान का उपयोग करने से अधिक काम करता है। – Tom

+0

@ टॉम: हाँ, उसे एक और डेटा संरचना का उपयोग करना चाहिए। यहां तक ​​कि जब वह 'स्पैर्सएरे' को सॉर्ट करने का प्रबंधन करता है तब भी वह मूल्यों को सही क्रम में प्राप्त नहीं कर पाएगा। आपके संपादन के संबंध में – nkr

उत्तर

0

SparseArray.java के लिए अंतर्निहित स्रोत कोड के आधार पर, आप बस एक विधि कॉल करके ऐसा करने में सक्षम नहीं होंगे। सभी SpareArray दो जावा-भाषा सरणी हैं, int टाइप करें और Object टाइप करें। वे सरणी निजी आवृत्ति चर हैं और आप बिना किसी प्रतिबिंब के संदर्भित कर सकते हैं (जो खतरनाक है क्योंकि उनके नाम बदल सकते हैं)। एक अच्छा समाधान आपके आवेदन में SpareArray कोड को स्थानीयकृत करना और सामान्य जावा तकनीकों का उपयोग करके sort विधि जोड़ें, यानी Array.sort

-5

अपनी कुंजी/मानों को एक सूचियों में एकत्रित करें।

   List<Integer>keys = Lists.newArrayList(); 
       List<Integer>vals = Lists.newArrayList(); 
    SparseArray<Integer>arr; 
    for(int i =0; i < arr.size();i++){ 
    keys.add(arr.keyAt(i)); 
    values.add(arr.valueAt(i)); 
    } 
    Collections.sort(keys);// sort 
    Collections.sort(vals); 
    // then fill your array again. 
    arr.clear(); 
    //... 
    arr.put() 
+1

यह निश्चित रूप से एक वैध दृष्टिकोण है लेकिन प्रदर्शन दृष्टिकोण से खतरनाक है। आप सूचियां बना रहे हैं जिन्हें सरणी आइटम प्राप्त करने के लिए बस एक विधि बनाने और कॉल करने की आवश्यकता नहीं है। इसके अलावा, आकार एक विधि नहीं है एक क्षेत्र है। – Tom

+6

यह निश्चित रूप से कुंजी और मूल्यों के मैपिंग को गड़बड़ कर देगा। – nkr

5

यह स्पष्ट करता है, तो आप एक कुंजी का अनुरोध किया या मूल्य आदेश अनुसार क्रमबद्ध तो बस एक नोट नहीं है ...

:

एक द्विआधारी खोज केवल क्रमबद्ध डेटा पर काम करता है और SparseArray एक द्विआधारी खोज का उपयोग करता है इसके क्रमबद्ध (!) कुंजी सरणी के लिए the source के अनुसार। तो चाबियाँ पहले से ही क्रमबद्ध हैं और मूल्यों के क्रम जैसे एक अलग क्रम को स्वीकार नहीं करेंगे।

2

उपयोग LinkedHashMap अगर आप चाहते हैं नक्शा क्रमबद्ध करना

अद्यतन:

आप ट्री-मैप का उपयोग कर सकते हैं। यह उनकी कुंजी द्वारा क्रमबद्ध प्रविष्टियों को रखता है (कुंजी को तुलनात्मक लागू करना चाहिए)।

+1

मैं तर्क दूंगा कि यह जवाब गलत है। 'लिंक्ड हैश मैप अपने आप को सॉर्ट नहीं किया गया है, नेट पर नेट और न ही मूल्य पर। [जावाएसई 7 दस्तावेज] के अनुसार (https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html) दी गई एकमात्र गारंटी कुंजी के पुनरावृत्ति क्रम को रखना है: "[ ...] आम तौर पर वह क्रम जिसमें कुंजी को मानचित्र में सम्मिलित किया गया था (सम्मिलन-आदेश) "। यह डेटा (या कुंजी) को सॉर्ट करने के बारे में कुछ भी नहीं कहता है। – dbm

+1

क्या Shayan_Aryan का मतलब मानक ट्रीमैप या ConcurrentSkipListMap जैसा कुछ है, https://docs.oracle.com/javase/8/docs/api/java/util/AbstractMap.html – Karussell

+0

@ करससेल हाँ, धन्यवाद। मैं वास्तव में इसका मतलब था। मैंने अपना जवाब अपडेट कर लिया है। –

2

एक छोटा सा संशोधन करने के लिए @ Karussell के स्पॉट पर जवाब यह है कि यह भी valueAt() विधि के प्रलेखन अपने आप में एक क्रमबद्ध क्रम चलता है (कुंजी पर) है:

[...] valueAt(0) मान प्रदान करेंगे जुड़े सबसे छोटी कुंजी और valueAt(size()-1) सबसे बड़ी कुंजी से जुड़े मूल्य को वापस कर देगा।

keyAt() विधि के लिए एक समान विवरण दिया गया है।

0

मेरी समाधान की जांच करें, कुंजी के अनुसार क्रमबद्ध:

private static SparseIntArray sFactorsMap = new SparseIntArray();  

    private static void sortMap() { 
     SparseIntArray sortedSparseIntArray = new SparseIntArray(); 
     while (sFactorsMap.size() > 0) { 
      int min = Integer.MAX_VALUE; 
      for (int i = 0; i < sFactorsMap.size(); i++) { 
       if (sFactorsMap.keyAt(i) <= min) { 
        min = sFactorsMap.keyAt(i); 
       } 
      } 
      sortedSparseIntArray.put(min, sFactorsMap.get(min)); 
      sFactorsMap.removeAt(sFactorsMap.indexOfKey(min)); 
     } 
     sFactorsMap = sortedSparseIntArray; 
    } 
संबंधित मुद्दे