当前位置: 首页 > 知识库问答 >
问题:

遍历数组中除最后一个索引之外的所有索引

符懿轩
2023-03-14

我知道在Swift 3中,循环的典型C风格发生了一些变化。我一直在努力解决这个问题,但在很多情况下,我似乎比以前编写了更多的代码。也许有人能把我引向正确的方向,因为这就是我想要的:

let names : [String] = ["Jim", "Jenny", "Earl"]
for var i = 0; i < names.count - 1; i+=1 {
    NSLog("%@ loves %@", names[i], names[i+1])
}

非常简单的东西。我希望能够获取我所在的索引,并且如果names.count==0,则不运行for循环。一气呵成。

但我在Swift 3中的选择似乎不允许我这样做。我必须做一些类似的事情:

let names : [String] = ["Jim", "Jenny", "Earl"]
if names.count > 0 {
    for i in 0...(names.count - 1) {
        NSLog("%@ loves %@", names[i], names[i+1])
    }
}

需要在开始时使用if语句,因为我的程序在读取:for i in 0…0{}的情况下会崩溃

我还喜欢这样一种想法,即能够在不显式设置索引的情况下迭代所有内容:

// Pseudocode
for name in names.exceptLastOne {
    NSLog("%@ loves %@", name, name.plus(1))
}

我觉得有某种语法混合了我所有的需求,但我还没有遇到它。有人知道办法吗?或者至少是一种让我的代码更紧凑的方法?

更新:有人建议这个问题已经被问过了,引用了一个SO帖子,其中的解决方案是使用某种程度的东西:

for (index, name) in names.enumerated {}

与哈米什的回答相比,问题是我只得到当前名称的索引。这不允许我在不需要做以下事情的情况下获得index的值:

names[index + 1]

这只是一个需要跟踪的额外变量。我更喜欢哈米什餐厅,它是:

for i in names.indices.dropLast() {
    print("\(names[i]) loves \(names[i + 1])")
}

简短、简单,只需跟踪名称和i,而不是名称、索引和名称。

共有1个答案

宰鸿博
2023-03-14

一个选项是在数组的索引上使用dropLast(),允许您迭代数组中除最后一个索引外的所有索引的可计数范围。

let names = ["Jim", "Jenny", "Earl"]

for i in names.indices.dropLast() {
    print("\(names[i]) loves \(names[i + 1])")
}

如果数组少于两个元素,则不会进入循环

另一个选项是zip包含第一个元素已删除的数组的数组,允许您迭代元素对及其后续元素:

for (nameA, nameB) in zip(names, names.dropFirst()) {
    print("\(nameA) loves \(nameB)")
}

这利用了zip截短两个序列中长度不相等的较长序列这一事实。因此,如果数组中的元素少于两个,则不会再次进入循环。

 类似资料:
  • 问题内容: 有没有一种简单的方法来索引列表(或数组,或其他)中 除 特定索引 之外的 所有元素?例如, 将把该物品退回位置3 将返回整个列表,除了3 问题答案: 对于 列表 ,您可以使用列表组合。例如,要制作不含第3个元素的副本: 这是非常通用的方法,可以与所有可迭代对象(包括numpy数组)一起使用。如果要更换有,将是一个迭代器,而非列表。 或者,您可以通过以下方式就地完成此操作: 在 nump

  • 我只需要数组Ex中的前两个索引:

  • 我有一个数组: 我调用它的拼接函数来删除索引之前的所有项: 我只是好奇有没有类似于splice的功能来移除一个索引后的所有项目: 伪码

  • 给定一个非负整数数组,您最初位于数组的第一个索引处。 数组中的每个元素表示该位置的最大跳跃长度。 您的目标是以最少的跳跃次数达到最后一个索引。 例如:给定数组 到达最后一个指数的最小跳跃次数为2次。(从索引0跳转1步到1,然后3步到最后一个索引。) 我已经从左到右构建了一个dp[]数组,以便dp[i]指示从arr[0]到达arr[i]所需的最小跳转次数。最后,我们返回dp[n-1]。 我的代码的最

  • 问题内容: 因此,假设我有一个大小为10的数组,索引范围为0到9。我在其中添加了一堆元素,并停止在索引6处添加。因此,使用array.length,我可以知道数组的大小为10,但是,如何找到哪个索引包含最后一个值,之后又为空?我是否想进行循环并在index == null处停止? 我通过创建一个动态数组来模拟arraylist,该数组在大小已满时会增长。 Arg,忘了告诉大家,如果数组为int,则

  • 我正在使用一个输入文件用不同的字符串填充我的数组。如何检查数组的填充位置?我将数组的大小初始化为30000,但如何检查它包含的字符串的索引? 谢谢你的帮助!