-4

私は持っていArrayList<HashMap<String,String>>ます。

HashMapsの配列の順序を変更する方法はありますか?たとえば、文字列 "firstName"がHashMap内にある場合、HashMapsのArrayListをその値で並べ替えることはできますか?明確にするために、HashMaps内でキーとオブジェクトを並べ替える必要はありません。Arraylist内でHashMapを注文する必要があります。

最善の方法は何ですか?

私は例からやろうとしました:

class MapComparator implements Comparator<HashMap<String, String>>
{
    private final String key;

    public MapComparator(String key)
    {
        this.key = key;
    }

    public int compare(HashMap<String, String> first,
            HashMap<String, String> second)
    {
        // TODO: Null checking, both for maps and values
         String firstName1 = first.get(key);
            String firstName2 = second.get(key);
            if(firstName1 == null)
                if(firstName2 == null)
                    return 0;
                else
                    return -1; // treat null as less than any non-null
            else
                if(firstName2 == null)
                    return 1; // treat null as less than any non-null
                else
                    return firstName1.compareTo(firstName2);

    }
}

および使用:

                Log.e(THIS_FILE, "before ->" + addedRows);
                Collections.sort(addedRows, new MapComparator("name"));
                Log.e(THIS_FILE, "after ->" + addedRows);

そして何もソートされていません(文字aで始まるように1つの連絡先の名前を変更したことを確認するために、name = as ice:)のハッシュマップを最初にする必要があります):

> E/ContactsActivity(23571): before ->[{type=, contactID=4, name=Office
> O}, {type=, contactID=2912, name=Test Text Last}, {type=,
> contactID=2915, name=as ife:) Eng}, {type=, contactID=2914,
> name=life:) Rus}, {type=, contactID=2913, name=life:) Ukr}, {type=,
> contactID=2897, name=дима куплеватскиц}] E/ContactsActivity(23571):
> after ->[{type=, contactID=4, name=Office O}, {type=, contactID=2912,
> name=Test Text Last}, {type=, contactID=2915, name=as ife:) Eng},
> {type=, contactID=2914, name=life:) Rus}, {type=, contactID=2913,
> name=life:) Ukr}, {type=, contactID=2897, name=дима куплеватскиц}]
4

2 に答える 2

3

あなたが抱えている問題は、HashMapが完全に順序付けられていないことだと思います。HashMapのデータに順序を追加する場合、古典的な解決策はTreeMapを使用することです。

状況によっては、を使い始めることができない場合がありますTreeMap。もしそうなら、あなたはあなたをに変換したいと思うでしょHashMapTreeMap

TreeMap treeMap = new TreeMap();
treeMap.putAll(hashMap);           // where "hashmap" was already filled

結果TreeMapは、の「キー」に基づいて並べ替えられますHashMap

ただし、のデータに順序を追加する場合、従来の解決策は同様にTreeListを使用することです。

それぞれの内部の値を使用してのArrayListを並べ替える場合は、を作成してに配置するだけです。元のキー以外のもので並べ替える場合は、問題があり、データ構造の選択を再考する必要があります。HashMapHashMapTreeMapTreeListArrayListHashMap

于 2012-12-20T18:27:49.843 に答える
2

それはあなたが望むもののように聞こえます:

java.util.Collections.sort
(
    list,
    new java.util.Comparator<Map<String,String>>()
    {
        public int compare(Map<String,String> map1, Map<String,String> map2)
        {
            String firstName1 = map1.get("firstName");
            String firstName2 = map2.get("firstName");
            if(firstName1 == null)
                if(firstName2 == null)
                    return 0;
                else
                    return -1; // treat null as less than any non-null
            else
                if(firstName2 == null)
                    return 1; // treat null as less than any non-null
                else
                    return firstName1.compareTo(firstName2);
        }
    }
);

(ここlistで、タイプの変数の名前ですArrayList<HashMap<String,String>>)。

于 2012-12-20T18:49:34.210 に答える