2011-11-17 1070 views
3

我是Java的新手,但对编程并不陌生,所以作为我的第一个项目,我决定在工作中为某人创建一个.txt-.csv分析器。我读取.txt文件中的每一行,并将其分隔为单独的地图中的部分,子部分,子部分以及子部分的内容。然后将每个地图分配到它上面的地图(更多在下面)。我打印一切就好了,但是当我尝试阅读它时,出现以下错误:"java.lang.String cannot be cast to java.util.Map"。该错误仅在代码运行后出现,而不是在编译时出现,也不出现在NetBeans IDE中。java.lang.String不能转换为java.util.Map

我的地图是在下面的表格与每个对象是在它下面的地图:(为什么不是Java使这个容易-_-关联数组都是我想要的)

(Map)array=<string,Object> 
(Map)subarray=<String,Object> 
(Map)subsubarray=<String,Object> 
(Map)subsubcontents=<String,String> 

未必是最有效的方法来阅读这个,计划将其转换为递归函数,但这里是我的代码,从我的项目复制粘贴。我在我发现错误的地方发表评论。

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(); 
        } 
      } 
    } 
} 

任何帮助将不胜感激。现在我已经挣扎了好几天了。

+0

你可以发布整个堆栈跟踪吗? –

+0

getStackTrace()返回[Ljava.langStackTraceElement; @ c0a150 – mseancole

回答

7

我想你需要清理你的泛型入手:

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(); 
      } 
     } 
    } 
} 

然后,你应该更明确的与你的array声明:

public static Map<String, Map<String, Map<String, Map<String, String>>>> array = new HashMap<String, Map<String, Map<String, Map<String, String>>>>(); 

这将确保你是丘比特将正确的对象分配到每个地图中。您将永远无法获得put a String值,因为它不会被编译,因此需要Map<>。这将允许你写下面的代码(而无需强制转换):

final Set<Map.Entry<String, Map<String, Map<String, Map<String, String>>>>> section = array.entrySet(); 
final Iterator<Map.Entry<String, Map<String, Map<String, Map<String, String>>>>> sectionI = section.iterator(); 
while (sectionI.hasNext()) { 
    final Entry<String, Map<String, Map<String, Map<String, String>>>> sectionInfo = sectionI.next(); 
    final Map<String, Map<String, Map<String, String>>> subMap = sectionInfo.getValue(); 
    final Set<Map.Entry<String, Map<String, Map<String, String>>>> subSet = subMap.entrySet(); 
    final Iterator<Map.Entry<String, Map<String, Map<String, String>>>> subI = subSet.iterator(); 
    while (subI.hasNext()) { 
     final Map.Entry<String, Map<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(); 
      } 
     } 
    } 
} 

之所以这么说,所有这些嵌套泛型的很难看。我建议你创建一些对象来表示你的数据。

+1

谢谢。虽然这并没有直接解决它,但它确实让我开始清理我的东西,然后我意识到我跳过了一个Map。感谢您的建议和帮助,谢谢大家。 – mseancole

1

异常告诉你一切。这个电话号码subsubInfo.getValue();实际上是返回String,而不是Map,所以在创建地图时出现逻辑错误。

编译器会发出警告,如果你改变你的声明来Map<String, Map>,而不是Map<String, Object>

相关问题