如何迭代列表并使用索引将元素添加到列表中

时间:2015-12-07 07:45:37

标签: list groovy

我使用下面的代码来迭代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)

2 个答案:

答案 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

虽然请注意同时查看和编辑任何集合是不安全的。所以你应该重新考虑整个过程。