2016-10-08 4 views
0

поэтому есть 3 слоя. У меня есть карта с ключом, пара значений, где это значение является другой картой. а вторая карта имеет ключ, пара значений, где значение является просто значением.Сделайте карту карты?

поэтому каждая клавиша имеет другой ключ, соединенный с ним, а второй ключ имеет значение.

это то, что я стараюсь:

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>());, а затем добавить «фрукты» к тому, что я попробую multiMap.get(1).put(fruit, apple);, но он не работает

+1

То, что вы делаете, работает, и, вероятно, так оно и будет, хотя есть и другие способы. Тем не менее, я голосовал, чтобы закрыть это как мнение, основанное на том, что «это лучший способ» - это вопрос, основанный на мнениях. – nhouser9

+0

То, как вы это делаете, является правильным ... лучшим способом ... если его о карте, тогда я бы тоже сделал это ... – Tirath

+0

Если у вас есть карта с ключом инкрементирующего целого числа, то вы должны использовать вместо этого ArrayList, на мой взгляд –

ответ

4

Это зависит. В примере, который вы дали, похоже, что на второй карте всегда будут одни и те же ключи. Если это так, я бы предложил использовать объект, чтобы упростить его чтение. Новый программист, впервые просматривающий код, мог бы понять это проще, и это хорошая практика. Я хотел бы предложить код, такие как следующие:

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

Я имею в виду, что вы всегда можете изобрести колесо, но вы также можете использовать MultiMap, например предоставлено Guava

Здесь вы можете поместить несколько значений одним и тем же ключом и изменить их. Это, вероятно, более чистая реализация, чем все это для себя.

Смежные вопросы