2012-08-28 8 views
6

どのように並べ替えることができますandroid.util.SparseArray? など。私はSparseArrayを持っている:
1から2.33
5から1.5
結果:
5から1.5
1から2.33AndroidでSparseArrayを並べ替え

感謝!

- 編集済み

私はマップを使用しました。手伝ってくれてありがとう。

+2

をあなたはそれをソートしたいと思うのはなぜ?キーは変更されず、 'SparseArray'は' Iterable'を実装しません。 – nkr

+2

'Iterable'はそれほど問題ではありませんが、このデータ構造をソートすることが目的ならば、' Map'のサブクラスのような一般的なJavaデータ構造が理にかなっています。 'SpareArray'を望みの方法でソートすることはできなかったとは言えませんが、すぐに使用できるソリューションを使用するよりも多くの作業があります。 – Tom

+0

@Tom:はい、彼は別のデータ構造を使うべきです。彼が 'SparseArray'をソートしても、正しい順序で値を取得することはできません。 – nkr

答えて

0

SparseArray.javaのソースコードで判断すると、単にメソッドを呼び出すことでそれを行うことはできません。すべてのSpareArrayは、2つのJava言語の配列で、タイプはintで、タイプはObjectです。これらの配列はプライベートなインスタンス変数なので、Reflectionなしではそれらを参照できません(名前が変わると危険です)。アプリケーションにSpareArrayコードをローカライズし、通常のJava技術(Array.sort)を使用して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

これは間違いなく有効なアプローチですが、パフォーマンスの観点からは危険です。作成する必要のないリストを作成し、単に配列項目を取得するためのメソッドを呼び出すことになります。また、sizeはフィールドではないメソッドです。 – Tom

+6

これは間違いなくキーと値のマッピングを混乱させるでしょう。 – nkr

5

ご注文のソートキーまたは値を要求された場合には、これだけのノート...

明らかではない。

バイナリ検索のみソートされたデータ上で動作し、SparseArrayは、バイナリ検索を使用していますthe sourceに従ってソートされた(!)キー配列を返します。したがって、キーはすでにソートされており、値の順序とは異なる順序を受け入れません。

2

使用のLinkedHashMapあなたはマップが

アップデートソートする場合は:あなたはTreeMapのを使用することができます

を。エントリをキーでソートしたままにします(キーはComparableを実装する必要があります)。

+1

私はこの答えが間違っていると主張します。 'LinkedHashMap'自体はソートされておらず、キーも値もありません。 [JavaSE 7 documentation](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; 
    } 
関連する問題