2016-08-25 4 views
0

マップで構成された複雑なオブジェクトのラベルを並べ替える際に問題があります。まあjava内の他のマップ内のマップのセットをソートする方法は?

Map<Class<? extends Fiche>, Map<String, Map<Family, Set<Map<ObjectField, DetailsField>>>>> Fields = new HashMap<>(); 

、私は並べ替えしようとしていることは、フィールドのラベルが含まれている列挙型であるObjectFieldキーは、これをソートすることによって、私はアルファベット順にラベルを取得しますされています。

問題は、ObjectFieldDetailsFieldを含むマップにアクセスする方法がわからないことです。フィールドには唯一のオブジェクトがあります。

私はJava 8でMapをソートする方法について知りましたが、Integerのソートには問題があり、オブジェクトマップがあります。誰かがこれを解決するアイディアを持っていますか?

ありがとうございます。

+0

HashMapは、独自のアルゴリズムを使用してストアの場所を決定するため、通常、要素を並べ替えるために悪い選択です。 – MaxZoom

+0

新しいデータ構造を作成するべきかどうか疑問に思っています。ある抽象レベル。パラメータ化された型があなたを混乱に導いているようです。 – user489041

+0

@MaxZoom私は完全にあなたに同意します、私はtreeMapによって最後のマップを置き換えることを考えていますが、コードに何も問題がないかどうかはわかりません。 – Chinovski

答えて

1

マップにアルファベット順にデータを保存しますか? Java TreeMapがこれに当てはまります。 TreeMapとHashMapは本質的に同じに使うことができますが、内部情報を少し違って保存します。コードをコンパイルするためには、イニシャライザを変更する必要があります。

+0

いいアイデアですが、キーはEnumに多くの変数が含まれており、このEnumのIDに応じてキー(Enum)をソートしたいのですか? – Chinovski

+1

Map を作成して、Enumをソートすることができます。 mapOfValues.put(currEnum.toString()、currEnum);のような値をマップに追加します。これにより、Enumとその名前がアルファベット順に並べられたMapが得られます。それは確かに整理されたマップを与えるでしょう。この質問もチェックしてください。http://stackoverflow.com/questions/17230233/sort-enum-values-alphabetically-and-the-add-them-to-a-spinner-arrayadapter – Brydenr

1

使用しているデータモデルは、として表すことができる。

A -> B -> C -> [D -> E] 

そして、あなたの質問はDでソートする方法です。 Dがあなたの構造の4つの深さである場合、AB、およびCのキーを提供して、並べ替えのためのD -> Eのコレクションを見つける必要があります。それには魔法はありません。最初の3つの値を持たずに3番目のレベルに到達することはできません。それがマップの性質です。

Dでソートすると、Dの自然順序ですべての(D,E)のペアを反復すると解釈できます。これは以下のように達成することができます:

Set<Map<D,E>> setOfMaps; 
setOfMaps.stream() 
    .flatMap(map -> map.entrySet().stream()) 
    .sorted(Map.Entry.comparingByKey()) 
    ... 

これは、必要に応じて、あなたがしてforEachやコレクターで処理することができStream<Map.Entry<D,E>>を生成します。

コメントとして、コレクションに完全に頼るのではなく、データ構造の一部をクラスにカプセル化すると、コードがより明確になる可能性があります。

関連する問題