2012-08-28 35 views
6

如何排序android.util.SparseArray? 例如我有SparseArray有:
1 - 2.33
5 - 1.5
結果:
5 - 1.5
1 - 2.33在Android中排序SparseArray

謝謝!

- 編輯

我已經使用了地圖。感謝幫助。

+2

你爲什麼要對它進行排序?密鑰不會改變,'SparseArray'不會實現'Iterable'。 – nkr

+2

'Iterable'並不是問題所在,但我同意如果目標是對這個數據結構進行排序,像Map類的子類一樣的普通Java數據結構會更有意義。並不是說你無法按照預期的方式對SpareArray進行排序,但比使用開箱即用的解決方案更有效。 – Tom

+0

@Tom:是的,他應該使用另一種數據結構。即使他設法對'SparseArray'進行排序,他也不能從正確的順序獲取值。 – nkr

回答

0

SparseArray.java的底層源代碼判斷,您將無法簡單地通過調用方法來做到這一點。所有SpareArray是兩個Java語言數組,其中一個類型爲int,另一個類型爲Object。這些數組是私有的實例變量,如果沒有Reflection(這些名稱可能會更改,這很危險),您不能引用它們。一個好的解決方案可能是將SpareArray代碼本地化到您的應用程序中,並使用常規Java技術添加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中,如果你想在地圖進行排序

更新:

您可以使用TreeMap的。它保持條目按鍵排序(鍵必須實現「比較」)。

+1

我會認爲這個答案是錯誤的。 'LinkedHashMap'本身不是自己排序的,無論是密鑰還是值。根據[JavaSE 7文檔](https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html),唯一的保證是保持鍵的迭代順序:「[ ...]通常是密鑰插入地圖的順序(插入順序)「。它沒有說明排序數據(或鍵)。 – dbm

+1

Shayan_Aryan可能是指標準TreeMap或類似ConcurrentSkipListMap的東西,請參閱https://docs.oracle.com/javase/8/docs/api/java/util/AbstractMap.html – Karussell

+0

@Karussell是的,謝謝。我完全是這個意思。我已經更新了我的答案。 –

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; 
    }