Groovy 分割地图最常用的方法是什么?

Groovy 分割地图最常用的方法是什么?,groovy,hashmap,Groovy,Hashmap,我需要将CSV文件读入映射,并将该映射传递给后端方法,问题是如果映射太大,后端方法可能会阻塞。因此,在传递之前,我需要将映射分解为更小的块(分区)。这是我到目前为止试过的 Map ginormousMap = extractMapFromFile() Map batchedMap = [:] int index = 0 for ( pair in ginormousMap ) { def source = pair.key def destination = pair.value

我需要将CSV文件读入映射,并将该映射传递给后端方法,问题是如果映射太大,后端方法可能会阻塞。因此,在传递之前,我需要将映射分解为更小的块(分区)。这是我到目前为止试过的

Map ginormousMap = extractMapFromFile()
Map batchedMap = [:]
int index = 0
for ( pair in ginormousMap ) {
    def source = pair.key
    def destination = pair.value

    batchedMap.put(source,destination)
    if(index > 0 && index % 100 == 0 ){
       sendToFragileBackEnd(batchedMap)
       batchedMap = [:]
   }
   index++

}
我认为在每100个元素中,这会将较小的映射发送到后端并重新初始化它


这样行吗?有更好的方法吗?

像这样的方法怎么样:

Map ginormousMap = extractMapFromFile()
(ginormousMap.size()/100).times { i ->
       sendToFragileBackEnd(ginormousMap[i*100..(i+1)*100-1)
}

我确信这不会开箱即用,也不美观,但我想你看到了它背后的想法:-)

一个简单的方法是使用collate()方法

Map fullMap = [a:1,b:2,c:3,d:4,e:5,f:6,g:7]

(fullMap.keySet() as List).collate(3).each{
    def map = fullMap.subMap(it)
    println map
}
collate()方法允许将列表划分为指定大小的子列表

如果集合是一个映射(在您的情况下),您可以将Map.keySet()转换为List,然后执行collate()方法

Map fullMap = [a:1,b:2,c:3,d:4,e:5,f:6,g:7]

(fullMap.keySet() as List).collate(3).each{
    def map = fullMap.subMap(it)
    println map
}
或者在你的代码中

Map ginormousMap = extractMapFromFile()

(ginormousMap.keySet() as List).collate(100).each{
    sendToFragileBackEnd(ginormousMap.subMap(it))
}

我喜欢你的建议,你介意把它清洗一下,这样它就可以开箱即用了吗?谢谢对我来说似乎太晚了是地图吗?确定这不是一个地图列表吗?我可能应该加上collate将一个列表拆分为一个列表列表,列表的大小由参数决定。