#java #map #iterator #hashmap
#java #словарь #итератор #hashmap
Вопрос:
У меня есть карта внутри карты внутри карты. Формат представляет HashMap<String, Map>
собой образец данных:
deviceName={commandName={dataKey1=[dataValue1], dataKey2=[dataValue2]}}
Способ ее настройки deviceName
key
— commandName
это значение and для него. Чтобы упростить, сейчас есть только одна, но может быть более одной команды. На второй итерации commandName
это key
и {dataKey1=[dataValue1], dataKey2=[dataValue2]}
является значением. На третьей итерации dataKey1
— это ключ и dataValue1
значение (это ArrayList).
Я могу выполнить итерацию по одному, но я не уверен, как это сделать.
public void analyseVersion(Map cmd) {
Iterator deviceIT = cmd.keySet().iterator();
while (deviceIT.hasNext()) {
String deviceName = (String) deviceIT.next();
//Map<String, Map> cmd = (Map<String, Map>) cmd.get(deviceName);//This will not work.
//At this point I want to iterate through each command and for each command iterate through each data set.
}
}
Комментарии:
1. Почему вы не используете дженерики для объявлений?
Ответ №1:
Для echo jtahlborn абстракция — ваш друг
public class Data
private Map<String, Object> attributes
public class Command
private Map<String, Data> data;
public class Device
private Map<String, Command> commands;
// in main, etc
for (Entry<String, Command> commandEntry : device.getCommandEntries())
{
for (Entry<String, Data> dataEntry : commandEntry.getValue().getDataEntries())
{
for (Entry<String, Object> attributeEntry : dataEntry.getValue().getAttributeEntries())
// do something
}
}
Ответ №2:
предполагая, что вы хотите сохранить эту структуру, вы должны использовать что-то подобное для своей cmd-карты:
Map<String, Map<String, Map<String,List<String>>>>
тем не менее, я бы рекомендовал обернуть эти карты в классы, чтобы сделать вашу жизнь проще, а ваш код намного чище.