2016-10-08 30 views
0

ですので、3つのレイヤーがあります。私は値が別のマップであるキーと値のペアを持つマップを持っています。 2番目のマップには値がちょうど値であるキー、値のペアがあります。地図の地図を作成しますか?

それぞれのキーには別のキーがあり、2番目のキーには値があります。

これは私がしようとするものである:

Map<Integer, Map<String, String>> multiMap = new HashMap<>(); 

ので、たとえば:これは私がマップに配置する必要があるデータである。

1 => fruit => apple 
    => color => red 
    => day => friday 

2 => fruit => orange 
    => color => blue 
    => day => monday 

3 => fruit => banana 
    => color => red 
    => day => thursday 

ので、私がしたい場合、私はMap<Integer, Map<String, String>> multiMap = new HashMap<>();

をすれば2の好きな色を取得するには私がしたいfavColor2 = multiMap.get(2).get(color)またはこのような何か。

これを行う最良の方法は?マップにデータを追加するときに問題があります。

これらのデータを追加することはできません。それはエラーを与える。だから私は最初にmultiMap.put(1, new HashMap<String, String>());を試してから、それに "果物"を追加しようとすると、私はを試してみるが、それはうまくいかない。

+1

あなたは何をしていますか、おそらく私はそれを行う方法ですが、他の方法もあります。しかし、私は、これが最良の方法であるかどうかは、本質的に意見に基づく質問であるため、意見に基づいてこれを終了することに投票しました。 – nhouser9

+0

あなたがやっているやり方は正しいです...最善の方法...マップについては、私は同じことをやろうとしています... – Tirath

+0

マップを使用して、代わりにArrayList、私の意見で –

答えて

4

それは依存する。あなたが与えた例では、2番目のマップには常に同じキーがあるようです。このような場合は、代わりにオブジェクトを使用して読みやすくすることをお勧めします。初めてコードを見ている新しいプログラマーは、この方法をより簡単に理解することができ、それは良い方法です。

public enum Fruit { 
    APPLE, ORANGE, BANANA; 

    @Override 
    public String toString(){ 
     // If needs be, override it and return a String for the fruit 
    } 
} 

日と色の同じ操作を行い、その後、値オブジェクトを作成します:

public class MapInfo{ 
    private Fruit fruit; 
    private Color color; 
    private Day day; 

    public MapInfo(Fruit fruit, Day day, Color color){ 
     this.fruit = fruit; 
     this.day = day; 
     this.color = color; 
    } 

    // Create accessors here 

    // Add a toString if needed 
} 

次に、あなたのMapオブジェクトが

だろう、私は次のようなコードをお勧めしたいです
Map<Integer, MapInfo> map = new HashMap<>(); 
1

いつでもあなたは車輪を再発明することができますが、マルチマップを使用することもできます。 Guava

同じキーで複数の値を入力して変更することができます。それはおそらくあなた自身のためにすべてを行うよりもクリーンな実装です