【问题标题】:Swift array for first object in array [duplicate]数组中第一个对象的Swift数组[重复]
【发布时间】:2016-09-03 20:32:39
【问题描述】:

我的罗马数字转换算法中有这段代码...

for (a, r) in arabicToRomanArray where substring.hasPrefix(r) {
    arabic += a
    let index = substring.index(substring.startIndex, offsetBy: r.characters.count)
    substring = substring.substring(from: index)
    break
}

我想知道是否有更简单的方法。

目前我正在执行 条件 for 循环,然后在第一个条目上中断。有没有办法在条件下做一个for first 类型块?

我能想到的唯一方法是过滤数组,然后从过滤后的数组中获取第一个对象并使用它。不过,这似乎比我现在正在做的更笨重。

编辑

在尝试编辑后,它也会使算法变慢,这是有道理的。

for/break 循环的最佳时间为 O(1),最差时间为 O(n)。

过滤器和第一种方法的最佳时间为 O(n)。

【问题讨论】:

  • 您在寻找index(where: predicate) 吗?
  • @MartinR 哦,我试试看。谢谢。是的,这行得通。谢谢:D
  • @MartinR 如果您想添加我会接受的答案。或者我可以自己写答案?
  • @MartinR 可能。我现在已经添加了我的答案,但我会将其标记为重复,以提供指向该 SO 问题的附加链接。

标签: arrays swift algorithm for-loop


【解决方案1】:

感谢@MartinR 的评论,我找到了一种更好的方法来做同样的事情。

它在时间上与 for/break 循环相当,但不那么笨重。

我之前的代码...

for (a, r) in arabicToRomanArray where substring.hasPrefix(r) {
    arabic += a
    let index = substring.index(substring.startIndex, offsetBy: r.characters.count)
    substring = substring.substring(from: index)
    break
}

现在……

let (a, r) = arabicToRomanArray[arabicToRomanArray.index(where:{string.hasPrefix($0.1)})!]
arabic += a
let index = substring(substring.startIndex, offsetBy: numCharacters)
substring = substring.substring(from: index)

使用数组函数...

array.index(where: (Element) -> Bool)

喜欢...

arabicToRomanArray.index(where:{string.hasPrefix($0.1)})

我还把一些代码重构为函数,一旦我这样做了,所以实际上是现在......

let (a, r) = findPrefixedArabicToRoman(string: substring)
arabic += a
substring = remove(numCharacters: r.characters.count, fromString: substring)

【讨论】:

    猜你喜欢
    • 2019-11-26
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多