Java.lang.String не может быть добавлено в java.util.Map

Я новичок в Java, но не новичок в программировании, так как мой первый проект решил создать парсер .txt-.csv для кого-то на работе. Я читаю каждую строку в файле .txt и разделяю ее на отдельные Карты для разделов, подсекций, подписок и содержимого подписок. Затем каждая Карта присваивается карте над ней (подробнее об этом ниже). Я печатаю все на нем просто отлично, но когда я пытаюсь его прочитать, я получаю следующую ошибку: "java.lang.String cannot be cast to java.util.Map". Ошибка появляется только после запуска кода, а не при компиляции, ни в среде IDE NetBeans.

Мои карты находятся в следующем виде, при этом каждый объект является Картой под ним: (Почему Java не может сделать это легким -_- Ассоциативные массивы - все, что я хочу)

(Map)array=<string,object>
(Map)subarray=<string,object>
(Map)subsubarray=<string,object>
(Map)subsubcontents=</string,object></string,object></string,object>

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

public static Map<string,object> array=new HashMap<string,object>();
/* Code for populating the following Maps and pushing them into array
<string,object>subarray
<string,object>subsubarray
<string,string>subsubcontents
*/
Set section=array.entrySet();
Iterator sectionI=section.iterator();
while(sectionI.hasNext()) {
 Map.Entry sectionInfo=(Map.Entry)sectionI.next();
 Map<string,object> subMap=(Map)sectionInfo.getValue();
 Set subSet=subMap.entrySet();
 Iterator subI=subSet.iterator();
 while(subI.hasNext()) {
 Map.Entry subInfo=(Map.Entry)subI.next();
 Map<string,object> subsubMap=(Map)subInfo.getValue();
 Set subsubSet=subsubMap.entrySet();
 Iterator subsubI=subsubSet.iterator();
 while(subsubI.hasNext()) {
 System.out.println("test");
 Map.Entry subsubInfo=(Map.Entry)subsubI.next();
 Map<string,object> subcontentsMap=(Map)subsubInfo.getValue();
/*
The above line seems to be causing the issues.
If you comment out the rest of this loop (below this comment)
the error will still appear. If you comment out the rest of this loop
(including the line above this comment) it disappears.
Power of deduction my dear Watson.
*/
 Set subcontentsSet=subcontentsMap.entrySet();
 Iterator keys=subcontentsSet.iterator();
 while(keys.hasNext()) {
 Map.Entry keyMap=(Map.Entry)keys.next();
 }
 Iterator values=subcontentsSet.iterator();
 while(values.hasNext()) {
 Map.Entry valueMap=(Map.Entry)values.next();
 }
 }
 }
}
</string,object></string,object></string,object></string,string></string,object></string,object></string,object></string,object>

Любая помощь будет высоко оценена. Я боролся с этим уже пару дней.

2 ответа

Я думаю, вам нужно очистить свои дженерики, чтобы начать с:

Set<map.entry<string, object="">> section = array.entrySet();
Iterator<map.entry<string, object="">> sectionI = section.iterator();
while (sectionI.hasNext()) {
 Map.Entry<string, object=""> sectionInfo = sectionI.next();
 Map<string, object=""> subMap = (Map<string, object="">) sectionInfo.getValue(); // is this actually a Map<string, object="">?
 Set<map.entry<string, object="">> subSet = subMap.entrySet();
 Iterator<map.entry<string, object="">> subI = subSet.iterator();
 while (subI.hasNext()) {
 Map.Entry<string, object=""> subInfo = subI.next();
 Map<string, object=""> subsubMap = (Map<string, object="">) subInfo.getValue(); // is this actually a Map<string, object="">?
 Set<map.entry<string, object="">> subsubSet = subsubMap.entrySet();
 Iterator<map.entry<string, object="">> subsubI = subsubSet.iterator();
 while (subsubI.hasNext()) {
 System.out.println("test");
 Map.Entry<string, object=""> subsubInfo = subsubI.next();
 Map<string, object=""> subcontentsMap = (Map<string, object="">) subsubInfo.getValue(); // somehow a String got in here?
/*
The above line seems to be causing the issues.
If you comment out the rest of this loop (below this comment)
the error will still appear. If you comment out the rest of this loop
(including the line above this comment) it disappears.
Power of deduction my dear Watson.
*/
 Set<map.entry<string, object="">> subcontentsSet = subcontentsMap.entrySet();
 Iterator<map.entry<string, object="">> keys = subcontentsSet.iterator();
 while (keys.hasNext()) {
 Map.Entry<string, object=""> keyMap = keys.next();
 }
 Iterator<map.entry<string, object="">> values = subcontentsSet.iterator();
 while (values.hasNext()) {
 Map.Entry<string, object=""> valueMap = values.next();
 }
 }
 }
}
</string,></map.entry<string,></string,></map.entry<string,></map.entry<string,></string,></string,></string,></map.entry<string,></map.entry<string,></string,></string,></string,></string,></map.entry<string,></map.entry<string,></string,></string,></string,></string,></map.entry<string,></map.entry<string,>

Затем вы должны быть более явным с вашим объявлением array:

public static Map<string, map<string,="" string="">>>> array = new HashMap<string, map<string,="" string="">>>>();
</string,></string,>

Это гарантирует, что вы помещаете правильные объекты в каждую из карт. Вы никогда не сможете put a String, где ожидается Map<>, потому что он не будет компилироваться. Это позволит вам написать следующий код (без необходимости приведения):

final Set<map.entry<string, map<string,="" string="">>>>> section = array.entrySet();
final Iterator<map.entry<string, map<string,="" string="">>>>> sectionI = section.iterator();
while (sectionI.hasNext()) {
 final Entry<string, map<string,="" string="">>>> sectionInfo = sectionI.next();
 final Map<string, map<string,="" string="">>> subMap = sectionInfo.getValue();
 final Set<map.entry<string, map<string,="" string="">>>> subSet = subMap.entrySet();
 final Iterator<map.entry<string, map<string,="" string="">>>> subI = subSet.iterator();
 while (subI.hasNext()) {
 final Map.Entry<string, map<string,="" string="">>> subInfo = subI.next();
 final Map<string, map<string,="" string="">> subsubMap = subInfo.getValue();
 final Set<map.entry<string, map<string,="" string="">>> subsubSet = subsubMap.entrySet();
 final Iterator<map.entry<string, map<string,="" string="">>> subsubI = subsubSet.iterator();
 while (subsubI.hasNext()) {
 System.out.println("test");
 final Map.Entry<string, map<string,="" string="">> subsubInfo = subsubI.next();
 final Map<string, string=""> subcontentsMap = subsubInfo.getValue();
 final Set<map.entry<string, string="">> subcontentsSet = subcontentsMap.entrySet();
 final Iterator<map.entry<string, string="">> entries = subcontentsSet.iterator();
 while (entries.hasNext()) {
 final Map.Entry<string, string=""> entry = entries.next();
 }
 }
 }
}
</string,></map.entry<string,></map.entry<string,></string,></string,></map.entry<string,></map.entry<string,></string,></string,></map.entry<string,></map.entry<string,></string,></string,></map.entry<string,></map.entry<string,>

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


Исключение указывает все. Этот вызов subsubInfo.getValue(); фактически возвращает String, а не Map, поэтому при создании ваших карт вы будете иметь логическую ошибку.

Компилятор предупредит вас об этом, если вы измените свои объявления на Map вместо Map

licensed under cc by-sa 3.0 with attribution.