Как делать ассоциативный массив большой вложенности в Java?

342
07 апреля 2017, 21:48

Есть у меня массив, примерно такой структуры:

array = [
    'charcaters' => [
        'characterName1' => [
            'blockingStance' => [
                ['name' => '1.jpg', 'url' => 'http://site.com/sprites/block/1.jpg'],
                ['name' => '2.jpg', 'url' => 'http://site.com/sprites/block/2.jpg'],
                ['name' => '2.jpg', 'url' => 'http://site.com/sprites/block/3.jpg']
            ],
            'walkingStance' => [
                ['name' => '1.jpg', 'url' => 'http://site.com/sprites/walk/1.jpg'],
                ['name' => '2.jpg', 'url' => 'http://site.com/sprites/walk/2.jpg'],
                ['name' => '2.jpg', 'url' => 'http://site.com/sprites/walk/3.jpg']
            ],
            'specialMoves' => [
                ['name' => '1.jpg', 'url' => 'http://site.com/sprites/special/1.jpg'],
                ['name' => '2.jpg', 'url' => 'http://site.com/sprites/special/2.jpg']
            ],
            ...
        ],
        'characterName2' => [
            .....
        ],
         ...
    ],
    'stages' => [
        'stageName1' => [
            'bridge' => [
                ['name' => '1.jpg', 'url' => 'http://site.com/sprites/bridge/1.jpg'],
                ['name' => '2.jpg', 'url' => 'http://site.com/sprites/bridge/2.jpg'],
                ['name' => '2.jpg', 'url' => 'http://site.com/sprites/bridge/3.jpg']
            ],
            'street' => [
                ['name' => '1.jpg', 'url' => 'http://site.com/sprites/street/1.jpg'],
                ['name' => '2.jpg', 'url' => 'http://site.com/sprites/street/2.jpg'],
                ['name' => '2.jpg', 'url' => 'http://site.com/sprites/street/3.jpg']
            ],
            'forest' => [
                ['name' => '1.jpg', 'url' => 'http://site.com/sprites/forest/1.jpg'],
                ['name' => '2.jpg', 'url' => 'http://site.com/sprites/forest/2.jpg']
            ],
            ...
        ],
        'characterName2' => [
            .....
        ],
         ...
    ],
    'other' => ...
    ......
];

Многие любители обкакать PHP. Однако там создать такой массив и работать с ним проще простого. И мне кажется это очень удобным.

В Java, исходя из этих данных, у меня итоговый объект является вот таким вот монстром:

Map<String, Map<String, Map<String, ArrayList<TreeMap<String, String>>>>>

где

TreeMap<String, String> - это конечные ключ-значение 
ArrayList<TreeMap<String, String>> - список этих самых ключей и значений
Map<String, ArrayList<TreeMap<String, String>>> - ключ: название состояния объекта, значение - список выше.
Map<String, Map<String, ArrayList<TreeMap<String, String>>>> - ключ: название объекта, значение - список состояний
Map<String, Map<String, Map<String, ArrayList<TreeMap<String, String>>>>> - конечный список.

Ужас.

В общем. Может я что-то не так понимаю и делаю, но...

Нет ли в Java средств быстро построить ассоциативный массив и желательно неограниченной вложенности? Возможно ли данную конструкцию с помощью тех средств как-то упростить, чтоб не было такого монстра? Или это is the only way?

Answer 1

Выглядит как попытка натянуть ассоциативный массив там, где он не нужен, так как на самом деле есть четкая структура. А Java любит ООП и классы. По сути у вас есть какие-то коллекции, описывающие последовательности изображений; есть некие персонажи, у которых есть, судя по всему анимации; есть сцены, состоящие из объектов. Это можно представить так:

class ImageInfo {
    String name;
    URI url;
}
class Character {
    String name;
    List<ImageInfo> blockingStanceImages;
    List<ImageInfo> walkingStanceImages;
    List<ImageInfo> specialMovesImages;
}
class StageObject {
    String name;
    List<ImageInfo> images;
}
class Stage {
    String name
    Map<String, StageObject> objects;
}
class Context {
    Map<String, Character> characters;
    Map<String, Stage> stages;
}
READ ALSO
Совместимость разных версий java

Совместимость разных версий java

Приложения, скомпилированные на более старой версии jdk, будут ли гарантированно работать на машине с более новой версией jdk, или нет? И наоборот,...

217
Нужно перевести код из C++ на Java [требует правки]

Нужно перевести код из C++ на Java [требует правки]

Нужно было решить задачу кодирования и декодированияНаписала на С++ так как владею этим языком, а нужно было на Java (не знаю данного языка)

307
При отправке запроса к апи SocketTimeoutException: Read timed out

При отправке запроса к апи SocketTimeoutException: Read timed out

На сервере софт мониторит и время от времени шлёт запросы к апиОколо суток софт работает просто идеально, а затем выдаёт эксепшн:

411