如何使用新值创建新地图,但是从现有地图创建相同的键?

时间:2014-01-15 18:13:15

标签: map groovy

我在Groovy中有一张现有的地图 我想创建一个具有相同键但不同值的新地图。

例如:

def scores = ["vanilla":10, "chocolate":9, "papaya": 0]
//transformed into
def preference = ["vanilla":"love", "chocolate":"love", "papaya": "hate"]

通过某种闭合来实现它,例如:

def preference = scores.collect {//something}

3 个答案:

答案 0 :(得分:4)

您可以使用collectEntries

scores.collectEntries { k, v ->
    [ k, 'new value' ]
}

使用map作为范围的替代方法是使用switch

def grade = { score ->
    switch( score ) {
        case 10..9: return 'love'
        case  8..6: return 'like'
        case  5..2: return 'meh'
        case  1..0: return 'hate'
        default   : return 'ERR'
    }
}

scores.collectEntries { k, v -> [ k, grade( v ) ] }

答案 1 :(得分:2)

漂亮的功能样式解决方案(包括您的范围,易于修改):

def scores = [vanilla:10, chocolate:9, papaya: 0]
// Store somewhere
def map = [(10..9):"love", (8..6):"like", (5..2):"meh", (1..0):"hate"]
def preference = scores.collectEntries { key, score -> [key, map.find { score in it.key    }.value] }
// Output: [vanilla:love, chocolate:love, papaya:hate]

答案 2 :(得分:1)

def scores = ["vanilla":10, "chocolate":9, "papaya": 0]

def preference = scores.collectEntries {key, value -> ["$key":(value > 5 ? "like" : "hate")]}

然后结果将是

[vanilla:like, chocolate:like, papaya:hate]

编辑:如果你想要一张地图,那么你应该使用像tim_yates这样的collectEntries。