HashMap<String, String[][]> map = new HashMap<>();
のようなvalueが(String型)2次元配列のHashMapを使っているのですが、Iteratorを用いて
Iterator<String> key_itr = map.keySet().iterator(); while(key_itr.hasNext()) { String str_key = (String)key_itr.next(); for(int i=0;i<len_zwei(map.get(str_key));i++) { // ここまでOK for(int j=0;j<len_eins((map.get(str_key))[i]);j++) { // この前の行でエラー } } }
のようにIteratorでmapのkeyを順に取り出してそのvalueの配列でfor文を回そうとしています。しかし、2つ目のfor文でlen_eins()というメソッドを用いてstr_keyのvalueにある2次元配列のi番目の配列の長さ(要素の数)を出しているところで java.lang.ArrayIndexOutOfBoundsExceptionのエラーが発生してしまいます。エラーが出ないようにするにはどうしたらいいでしょうか。
len_eins,len_zweiメソッドは次のような感じです。
len
1 public static int len_eins(String[] str) { 2 int i = 0; 3 while(str[i] != null) { 4 i++; 5 } 6 return i; 7 } 8 9 public static int len_zwei(String[][] str) { 10 int i = 0; 11 while(str[i][0] != null) { 12 i++; 13 } 14 return i; 15 }
HashMapに入っていない普通の2次元配列(str[][])でlen_eins(str[0])のようにした場合はエラーは出ず、正しい配列に入っている(nullでない)要素数をが返ります。HashMapには予めkeyとvalueが入っており、str_keyもmap.get(str_key)[][]の中身も出力はできます。
追記のプログラム
Iterator<Map.Entry<String, String[][]>> entry_itr1 = map.entrySet().iterator(); while(entry_itr1.hasNext()) { Map.Entry<String, String[][]> entry1 = entry_itr1.next(); for(int i=0;i<len_zwei(entry1.getValue());i++) { for(int j=0;j<len_eins(entry1.getValue()[i]);j++) { // 1度目の処理 } } } Iterator<Map.Entry<String, String[][]>> entry_itr2 = map.entrySet().iterator(); while(entry_itr2.hasNext()) { // この次の行でエラー発生 Map.Entry<String, String[][]> entry2 = entry_itr2.next(); // 380行目 String str_key2 = entry2.getKey(); for(int i=0;i<len_zwei(entry2.getValue());i++) { for(int j=0;j<len_eins(entry2.getValue()[i]);j++) { // 2度目の処理 } } }
追記のエラー文
Exception in thread "main" java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445) at java.util.HashMap$EntryIterator.next(HashMap.java:1479) at java.util.HashMap$EntryIterator.next(HashMap.java:1477) at KCFG.KCFG_main.ToDCG(main.java:380) at KCFG.KCFG_main.main(main.java:109)
main文内の109行目で上の追記のプログラムのあるメソッドを呼び出しています。
回答2件
あなたの回答
tips
プレビュー