我使用下面的代码来迭代list
并将元素添加到list with index
hierhier.each() { k, v ->
println 'k---------' + k
if(k == 0){
dataList += v
println "dataList first ----------- " + dataList
}else{
dataList.eachWithIndex {list,index-> // line no 2566
if(dataList[index].get(primaryField) == k){
//println "index---------" + dataList[index].get(index)
int position = index
println 'position--------- ' + ++position
v.each {it ->
//dataList[index] = v
dataList.add(position,it)
position++
println "dataList----------- " + dataList
}
}
}
}
}
但它的投掷错误
java.util.ConcurrentModificationException
虽然第一次我的意思是第一个迭代器工作正常但是下一个迭代器,即第二个迭代器它不工作。如何通过匹配我的要求来解决此问题。
输出:
错误| java.util.ConcurrentModificationException
错误| com.acumetric.hrat.aggregator.yourService $ _ $ $$ tt__getDataForGrid_closure84 EPWABwO5.doCall(DataImportService.groovy:2566)
答案 0 :(得分:0)
eachWithIndex
方法使用Iterator
,您发现它不允许添加元素。相反,您可以使用ListIterator
方法中的listIterator()
来收集dataList
。最重要的是,它包含add
方法。
我不太了解你关于v
的逻辑,但总的想法是这样的:
hierhier.each() { k, v ->
if(k == 0){
dataList += v
} else {
def iter = datalist.listIterator()
// iterate though `dataList` as long as there is a next element
while(iter.hasNext()) {
def list = iter.next()
if(list[primaryField] == key){
v.each {it ->
iter.add(it)
}
}
} // while
} // else
}
答案 1 :(得分:0)
您正在迭代期间更改地图,因此会抛出 ConcurrentModificationException 。
如果你确定这是正确的方法,你可以从常规地图切换(hierhier可能是HashMap,对吧?)到ConcurrentHashMap 。
虽然请注意同时查看和编辑任何集合是不安全的。所以你应该重新考虑整个过程。