N***m 发帖数: 4460 | 1 初学groovy,遇到一个小问题。想把map每个key+1怎么写?
我如下写运行出错:
def f = [1:'ken',2:'sam',3:'bob'].collect
{entry-> entry.setKey(entry.getKey()+1);return entry}
3x!
|
o**1 发帖数: 6383 | 2 没有setKey这个东西。
只能setValue
【在 N***m 的大作中提到】 : 初学groovy,遇到一个小问题。想把map每个key+1怎么写? : 我如下写运行出错: : def f = [1:'ken',2:'sam',3:'bob'].collect : {entry-> entry.setKey(entry.getKey()+1);return entry} : 3x! :
|
N***m 发帖数: 4460 | 3 我不太明白:)
http://groovy.codehaus.org/gapi/groovy/util/MapEntry.html
这个API里面的setkey是做什么用的?
【在 o**1 的大作中提到】 : 没有setKey这个东西。 : 只能setValue
|
o**1 发帖数: 6383 | 4 我也是刚开始学 Groovy/Grails.
[1:'ken',2:'sam',3:'bob'] 这个Map的类型是 LinkedHashMap,
所以每个entry是 LinkedHashMap.Entry 类型,而不是 groovy的 MapEntry
【在 N***m 的大作中提到】 : 我不太明白:) : http://groovy.codehaus.org/gapi/groovy/util/MapEntry.html : 这个API里面的setkey是做什么用的?
|
N***m 发帖数: 4460 | 5 你的意思是key不能变?
【在 o**1 的大作中提到】 : 我也是刚开始学 Groovy/Grails. : [1:'ken',2:'sam',3:'bob'] 这个Map的类型是 LinkedHashMap, : 所以每个entry是 LinkedHashMap.Entry 类型,而不是 groovy的 MapEntry
|
o**1 发帖数: 6383 | 6 是,我觉得Key不能变。
我能想出来的办法是产生一个新 map
Map n = [:]
[1:'ken',2:'sam',3:'bob'].each{
n.put(it.key+1, it.value)
}
print n
【在 N***m 的大作中提到】 : 你的意思是key不能变?
|
N***m 发帖数: 4460 | 7 恩,这样可行。LinkedHashMap key不能变是因为什么?
是因为不符合原来的插入顺序嘛?
【在 o**1 的大作中提到】 : 是,我觉得Key不能变。 : 我能想出来的办法是产生一个新 map : Map n = [:] : [1:'ken',2:'sam',3:'bob'].each{ : n.put(it.key+1, it.value) : } : print n
|
o**1 发帖数: 6383 | 8 所有 Map 的Key都是Read Only.
这不是groovy的事,是JDK就这么design的。
如果key是 mutable object, reference不能变,但是可以指向别的object.
但是这是强烈不推荐的,会造成很隐藏的bug.
【在 N***m 的大作中提到】 : 恩,这样可行。LinkedHashMap key不能变是因为什么? : 是因为不符合原来的插入顺序嘛?
|
|
N***m 发帖数: 4460 | 9
3x a lot!
【在 o**1 的大作中提到】 : 所有 Map 的Key都是Read Only. : 这不是groovy的事,是JDK就这么design的。 : 如果key是 mutable object, reference不能变,但是可以指向别的object. : 但是这是强烈不推荐的,会造成很隐藏的bug.
|
r*****l 发帖数: 2859 | 10 这个数据结构可能更适合你:
f = [[1:'ken'],[2:'sam'],[3:'bob']]
【在 N***m 的大作中提到】 : 初学groovy,遇到一个小问题。想把map每个key+1怎么写? : 我如下写运行出错: : def f = [1:'ken',2:'sam',3:'bob'].collect : {entry-> entry.setKey(entry.getKey()+1);return entry} : 3x! :
|