2
HashMap<ArrayList<Integer>, String>

この構造を反復すると、次のようになります。

[1 1 0], "gh"
[0 4 2], "gh"
[0 5 2], "qh"

ただし、これをキーで(昇順で)並べ替えて取得したい

[0 4 2], "gh"
[0 5 2], "qh"
[1 1 0], "gh"

最初のコンポーネントが最初にソートされ、次に 2 番目、3 番目のコンポーネントがソートされます。

4

2 に答える 2

4

HashMaps には固有の順序はありません。

このクラスは、マップの順序を保証しません。特に、順序が長期的に一定であることを保証するものではありません。

反復する前に、別のデータ構造を使用するか、自分でキーを外部的に並べ替えます。いずれにせよ、展開しないComparator<List<Integer>>ので、書く必要がありますList<E>Comparable<List<E>>

List<List<Integer>> keys = new ArrayList<>(map.keySet());
Collections.sort(keys, new Comparator<List<Integer>>() {
    @Override public int compare(List<Integer> a, List<Integer> b) {
        // TODO handle edge cases, like lists of differing size

        for (int i=0; i<Math.min(a.size(), b.size()); i++) {
            int result = Integer.compare(a.get(i), b.get(i));
            if (result != 0) {
                return result;
            }
        }

        return 0;
    }
});

for (List<Integer> key : keys) {
    String value = map.get(key);
    // do something interesting with the value
}

注意 : 通常、任意のタイプのマップで変更可能なキーを使用するのは悪い考えです。個人的には、必要があったことは一度もありません。少なくとも代わりに、不変の整数リストを使用してください。

于 2012-12-09T05:50:23.283 に答える
0

TreeMap が役立つ場合があります。これを処理するにはいくつかの方法があります。個人的には、Map へのインデックスとして ArrayList を使用しません。代わりに、ArrayList からキーを作成し、実際の ArrayList を値に含めます。

上記の場合、Map の値は次のタイプになります。

class SomeClass() {
    ArrayList<Integer> aList;
    String aString;  // gh and qh in your example.
    public Integer getKey() {
        // Do something here to create a suitable key from aList and return it.
    } 
}

(構造的には、この種のクラスはおそらくあなたが望むもののほうが多いでしょう - List と String が関連している場合、それらを分離したくないでしょう。明らかにそうであるように見えます。)

ここで、HashMap ではなく TreeMap を作成し、SomeClass インスタンスを追加します。

TreeMap treeMap = new TreeMap();
SomeClass someClass = new SomeClass(...); // construct it somehow
treeMap.add(someClass.getKey(), someClass);

ボブはあなたのおじです。

于 2012-12-09T05:56:49.313 に答える