1

次の構造に基づいてネストされたツリーマップがあり、同じ構造で「2」から継続します。

http://pastebin.com/uKwAVz5L

ご覧のとおり、すでに「c13」サブアイテム(エピソード番号)で並べ替えられていますが、アプリケーションでツリーマップを使用すると、次のように表示されます。

http://i50.tinypic.com/15o9vno.png

それらはリモートでソートされていません..しかし、なぜかわかりませんか?:O

私のAndroidアプリで使用する場合も同じ問題です。

乾杯

4

2 に答える 2

1

TreeMapに関するいくつかの貴重な情報は次のとおりです。

SortedMapインターフェースの赤黒木ベースの実装。このクラスは、使用されるコンストラクターに応じて、マップがキーの昇順で、キーのクラスの自然な順序Comparableを参照)に従って、または作成時に提供されるコンパレーターによってソートされることを保証します。

このソートされたマップがMapインターフェースを正しく実装するためには、ソートされたマップによって維持される順序(明示的なコンパレーターが提供されているかどうかに関係なく)がequalsと一致している必要があることに注意してください。(equalsとの整合性の正確な定義については、ComparableまたはComparatorを参照してください。)これは、Mapインターフェイスがequals操作で定義されているためですが、マップはcompareTo(またはcompare)メソッドを使用してすべてのキー比較を実行するため、2つのキーがあります。この方法で等しいと見なされるものは、ソートされたマップの観点からは等しいです。ソートされたマップの動作は、その順序がequalsと矛盾している場合でも明確に定義されています。Mapインターフェースの一般的な契約に従わないだけです。

上記の方法を正しく実装しましたか?

コレクションフレームワークのさまざまな実装もあります(概要はこちら)。TreeMapが必要な機能を提供しない場合は、別の機能を実装して、必要に応じて変更できます。

于 2013-02-10T10:05:56.230 に答える
0

コンパレータを使用してみてください。

TreeMap map = new TreeMap<Obj1, Obj2>(new ObjComparator());

private class ObjComparator() implements Comparator<Obj1> {
    public int compareTo(Obj1 o1, Obj1 o2) {
        return o1.compareTo(o2); // do your logic here
    }
}
于 2013-02-10T11:26:08.603 に答える