Nim:根据谓词查找seq中元素的索引

Nim: Find index of element in seq based on predicate

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

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

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

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

import sequtils

proc isLen4(s: string): bool =
  len(s) == 4

echo map(@["pie", "cake", "ice cream"], isLen4).find(true)  #--> 1

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

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