【问题标题】:Finding the key in a map, given the value给定值,在地图中查找键
【发布时间】:2012-12-26 18:30:28
【问题描述】:

您好,我有一张这样的地图:

[this:0, is:1, a:2, file:3, anotherkey:4, aa:5]

如果给定地图的value,我希望能找到key。例如,如果给定值5,我需要从地图中返回aa

这可能吗?

【问题讨论】:

    标签: groovy map


    【解决方案1】:

    我不知道是否有直接的方法来获取给定值的键,但是使用Map#find 获取映射条目然后获取其值应该足够了:

    def keyForValue(map, value) {
        map.find { it.value == value }?.key
    }
    
    def map = [a: 1, b: 2, c: 3]
    assert keyForValue(map, 2) == 'b'
    assert keyForValue(map, 42) == null
    

    一般来说,映射不需要在它们的条目之间有顺序关系,但是 Groovy 的文字映射的默认实现是 LinkedHashMap,它有序的,所以keyForValue 总是会产生使用这些映射时值的第一个键。

    【讨论】:

      【解决方案2】:

      没有具体的命令。

      幸运的是,如 here 所示,您可以轻松获取映射中特定值的键:

      def myMap = [this:0, is:1, a:2, file:3, fix:4, aa:5]
      def myValue = 5
      

      你可以这样做:

      def myKey = myMap.find{ it.value == myValue }?.key
      // 'aa'
      

      如果你想要所有的键,请执行以下操作:

      def myMap = [this:0, is:1, a:2, file:3, fix:4, aa:5, bb:5]
      def myValue = 5
      
      def myKeys = []
      myMap.findAll{ it.value == myValue }.each{myKeys << it?.key}
      // ['aa', 'bb']
      

      【讨论】:

        【解决方案3】:

        你可以像这样反转地图:

        Map m = [a: '1', b: '2']
        Map mInvert = m.collectEntries { e -> [(e.value): e.key] }
        
        assert mInvert == ['1':'a', '2':'b']
        
        assert mInvert['2'] == 'b'
        assert m['b'] == '2'
        

        【讨论】:

        • 不,你的代码很有趣 :) 但是性能杀手,因为你重新创建了另一个地图。有一种方法可以找到一个给定值的 Map 条目,正确的答案已经由 Epidemia 很久以前给出:myMap.find{ it.value == 5 }.key
        • @ARA 实际上对于重复使用,只要不是每次都重新创建倒置集合,crazy4groovy 的解决方案就会更快。当您可以使用 O(logN) 的地图时,您不应该遍历列表 O(n)。当然,无论如何,性能应该排在可读性的后面——如果做得好的话,crazy4groovy 的解决方案可能也更具可读性......但是它并不是非常“Groovy”:)
        • @Bill :是的,我所说的性能杀手是每次都重新创建地图,就像使用 lambda 即时重新创建地图的示例一样。当然,如果不是在每次调用时重新创建并维护地图,这将比迭代快得多。这就是地图的目的。 :) 而且我认为 Map 是 O(1) 而不是 O(log(n)),btree 是 O(log(n))?
        【解决方案4】:

        您可能必须自己遍历entry set 并尝试找到与value 匹配的条目。

        【讨论】:

          【解决方案5】:
          def expect = 5
          def m = ['this':0, is:1, a:2, file:3,  aa:5]
          def r = m.collectMany{ k,v -> (v == expect) ? [k] : []}
          
          // Result: [aa]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-04-25
            • 1970-01-01
            • 2021-12-17
            • 2021-08-27
            • 1970-01-01
            • 2020-11-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多