【问题标题】:How to know the indices of values in collection [closed]如何知道集合中值的索引[关闭]
【发布时间】:2011-11-10 23:29:06
【问题描述】:

参考这个问题:How to subtract dates from each other

在 Groovy 中,我有一个脚本可以从文本文件集合中吐出 5 个最大值。我怎么知道这些值的索引是什么?

【问题讨论】:

    标签: file list collections groovy indexing


    【解决方案1】:

    如果您有清单,即:

    def list = [ 'c', 'a', 'b' ]
    

    知道原始索引的一种方法是使用transpose()将此列表加入计数器,然后对新列表进行排序,然后您将获得一个以原始索引作为辅助元素的排序列表

    即:

    [list,0..<list.size()].transpose().sort { it[0] }.each { item, index ->
      println "$item (was at position $index)"
    }
    

    将其分解;

    [list,0..<list.size()]
    

    给我们(有效地)一个新列表[ [ 'c', 'a', 'b' ], [ 0, 1, 2 ] ]

    为此致电transpose() 给我们:[ [ 'c', 0 ], [ 'a', 1 ], [ 'b', 2 ] ]

    然后我们使用sort { it[0] }根据每个元素中的第一项(原始列表中的字母)对列表进行排序

    然后遍历每一个,打印出我们现在排序的项目,以及它的原始索引位置

    【讨论】:

    • 谢谢蒂姆,非常感谢您的解释。你在帮助我学习,我无法告诉你崩溃有多棒。我不会只是复制和粘贴(在尝试找出代码之后);您正在传达一种理解并让我在未来使用这些概念。教人钓鱼……
    • 一如既往的好答案:)。但是,我认为转置技巧可能有点太聪明了。带有计数器的collect 也可以发挥作用:def i = 0; list.collect { [it, i++] },也许它更容易理解。 inject 也可以做到这一点,不需要额外的声明,但我认为它不那么漂亮。很遗憾collect 不接受带有元素和索引的闭包 (yet),或者没有类似 Python 的 enumerate
    • @epidemian 你好!我完全同意使用外部计数器变量更易于阅读,但是自从我开始进行更多函数式编程以来,我尝试尽可能避免定义显式变量。可能只是我的编程大脑的一部分被学习 Clojure 打破了;-)
    • @tim_yates 是的,具有讽刺意味的是,函数式编程会在我们的大脑中产生副作用,呵呵。我也喜欢这个。也许如果我采用这种方法,我会在List 中添加一个enumerate 方法,以获取(索引,值)对的列表,例如Python's equivalent。干杯。
    【解决方案2】:

    如果值是唯一的,您可以只使用indexof 方法而不是原始列表。例如,如果您有列表:

    def list = [4, 8, 0, 2, 9, 5, 7, 3, 6, 1]
    

    而且你知道如何获得 5 个最大值:

    def maxVals = list.sort(false, {-it}).take 5 // This list will be [9, 8, 7, 6, 5]
    

    你可以这样做:

    def indexes = maxVals.collect { list.indexOf it }
    println indexes
    

    它会打印出来:

    [4, 1, 6, 8, 5]
    

    【讨论】:

    • 你能描述一下你的第二行代码在做什么吗? def maxVals...
    • @blaughli 当然!我正在使用方法sort(boolean mutate, Closure closure)。将false作为第一个参数传递,防止排序方法修改原始列表;它改为返回一个新的排序列表。第二个参数是一个闭包,它返回用于在 sort 方法中进行比较的值。在这种情况下,传递闭包{-it} 将按降序对列表进行排序。整行相当于def maxVals = list.clone().sort().reverse().take(5)
    • 我认为最易读的形式可能是def maxVals = list.sort(false).reverse().take(5)
    • 漂亮,非常感谢!你们在学校考得好吗?还是只是练习?
    • @blaughli 这有点跑题了,如果你用谷歌搜索它们,肯定会有关于如何更好地编程的好文章。我只能谈谈我认为的经历。在大学里的几年帮助我掌握了一些完成事情和学习新东西的纪律。但我认为与众不同的是始终在寻找更好的做事方式(例如,在 StackOverflow =D 中询问或寻找答案);无论是在工作中还是在为大学做家庭作业项目,通常不需要你编写好的代码,所以由你来关心与否。干杯!
    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 2012-11-21
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多