【问题标题】:Nim: Find index of element in seq based on predicateNim:根据谓词查找 seq 中元素的索引
【发布时间】:2021-12-08 10:45:13
【问题描述】:

如果我有一个值序列,我将如何根据谓词函数找到元素的索引?例如,如果我有以下序列:

let values = @["pie", "cake", "ice cream"]

如何找到具有四个字符的第一个元素的索引?我知道find,但它似乎只能通过相等来查找索引,并且不允许传递谓词。我可以自己实现它,但如果find 是,感觉它应该在标准库中。

【问题讨论】:

    标签: seq nim-lang


    【解决方案1】:

    一个简单的解决方案是使用sequtils 中的map 将谓词映射到输入序列,然后使用find 获取结果中第一个true 值的索引。当序列中没有元素满足谓词时,这将返回 -1:

    import sequtils
    
    proc isLen4(s: string): bool =
      len(s) == 4
    
    echo map(@["pie", "cake", "ice cream"], isLen4).find(true)  #--> 1
    

    这可行,但对大序列不利,因为map 处理整个序列。因此,即使第一个元素满足谓词,整个序列也会被处理。最好只编写一个findIf 过程,当谓词满足时返回当前索引,而不是继续处理其余的输入:

    proc findIf[T](s: seq[T], pred: proc(x: T): bool): int =
      result = -1  # return -1 if no items satisfy the predicate
      for i, x in s:
        if pred(x):
          result = i
          break
    
    echo @["pie", "cake", "ice cream"].findIf(isLen4)  #--> 1
    

    【讨论】:

    • 我最终实现了与您类似的自己的程序。如果这不是标准的一部分,我有点好奇,但实现我自己的解决方案也可以。
    • 我不知道为什么它不在 Nim 标准库中;语言将这种功能留给用户或第三方库的情况并不少见。它很容易实现,我猜这只是一千个简单函数中的一个,这些函数被确定为略微有用并被遗漏了。你可以随时问on the Nim forum
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多