[英]Java iterate/foreach ArrayList containing a hashmap/map<Int, Int>
對於一項作業,我遇到了一個問題。 我會告訴您我正在做什么。
作業要求我創建一個Java小程序(即使我使用的是JFrame
,哎呀),也可以以一段文本的形式從用戶那里獲取輸入。 使用此文本,程序將在每個單詞長度中顯示多少個單詞,並在單獨的窗口中以圖形的形式顯示結果。 我的哈希圖包含兩個Integer
,單詞的長度以及該長度有多少。
但是,該分配要求用戶能夠上載兩個文本文件並比較結果,因此我必須發送一個哈希圖數組,每個哈希圖具有單獨的結果到窗口。 我一直這樣做:
public void dispatchNewGraph (ArrayList<Map<Integer, Integer>> sortedCount) {
TextAnalyserGraph graphFrame = new TextAnalyserGraph(sortedCount);
}
在打開的窗口中,傳遞給構造函數的數據將應用於TextAnalyserGraph類private ArrayList<Map<Integer, Integer>> graphData;
中的此屬性private ArrayList<Map<Integer, Integer>> graphData;
我的問題是,當我嘗試使用以下代碼迭代此HashMaps數組時,我收到一個nullpointerexception
錯誤:
for(Iterator<Map<Integer, Integer>> i = graphData.iterator(); i.hasNext(); ) {
Map<Integer, Integer> graph = i.next();
for (Integer value : graph.keySet()) {
if(graph.containsKey(value)) {
Integer v = graph.get(value);
if (v.intValue() > largest)
largest = v.intValue();
}
bars++;
}
}
錯誤從最后一個代碼塊的第一行開始。 如果將graphData移至下一行,則相同的錯誤會從那里開始,指示存在graphData問題。我真的很難在此方面取得進展!
非常感謝! :)
堆棧跟蹤
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at TextAnalyserGraph.paint(TextAnalyserGraph.java:47)
at javax.swing.RepaintManager$3.run(RepaintManager.java:819)
at javax.swing.RepaintManager$3.run(RepaintManager.java:796)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:796)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:769)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:718)
at javax.swing.RepaintManager.access$1100(RepaintManager.java:62)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1677)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
循環之前,您需要對graphData進行空檢查。
我還建議修改您的for循環,使其更好一些。
如果您關心這些鍵,可以使用它:
if(graphData != null){
for(Map<Integer, Integer> valueMap : graphData){
for (Map.Entry<Integer, Integer> entry : valueMap.entrySet()) {
if (entry.getValue() > largest)
largest = entry.getValue();
bars++;
}
}
}
但是由於您不關心密鑰,並且密鑰已在循環邏輯中使用,因此我建議:
if(graphData != null){
for(Map<Integer, Integer> valueMap : graphData){
for (Integer value : valueMap.values()) {
if (value > largest)
largest = value;
bars++;
}
}
}
除非您對輸入有100%的控制權,否則您將需要在請求迭代器之前檢查graphData是否為null,然后在請求鍵集之前檢查graph是否為null。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.