【问题标题】:How to merge values from an array by position looping如何通过位置循环合并数组中的值
【发布时间】:2019-12-27 00:39:35
【问题描述】:

我希望通过它们各自的位置 [0] 和 [1] 附加两个数组的值。例如 - firstArray = [“John”, “Sam”] 和 secondArray = [“Smith”, “Thomas”]。

我希望输出读取为 John Smith 和 Sam Thomas。

我尝试创建一个循环来循环,如下所示:

import UIKit

var firstArray = ["John", "Tim"]
var secondArray = ["Smith"]

for i in firstArray.count - 1 {
let name = firstArray[i] + secondArray[i]
}

错误信息:类型'Int'不符合协议'Sequence'

【问题讨论】:

标签: arrays swift


【解决方案1】:

最好的方法可能是使用zipmap

假设你有名字和姓氏的数组:

let firstNames = ["John", "Sam", "Phil"]
let lastNames = ["Smith", "Thompson"]

let fullNames = zip(firstNames, lastNames).map { first, last in
   return "\(first) \(last)"
}

它只会结合最先结束的序列,所以在这个例子中,你会得到["John Smith", "Sam Thompson"].

【讨论】:

  • 感谢@kid_x 花时间回复。
【解决方案2】:

for 循环的正确语法是:

for [VARIABLE_NAME] in [SEQUENCE] {

}

在这种情况下,它可能是

for i in 0...(firstArray.count - 1) { }

for i in 0..<firstArray.count { }

要合并两个数组,您可以这样做:

let firstArray = ["John", "Sam"]
let secondArray = ["Smith",]

var names = zip(firstArray, secondArray).map { $0 + " " + $1 }

如果要添加更长的数组的其余部分:

if firstArray.count < secondArray.count {
    names.append(contentsOf: secondArray[firstArray.count...])
} else if secondArray.count < firstArray.count {
    names.append(contentsOf: firstArray[secondArray.count...])
}

print(names)    //["John Smith", "Sam"]

最后,你可以这样加入他们:

let joinedNames = names.joined(separator: " and ")  //John Smith and Sam

更一般地说,您可以通过这种方式合并任意数量的数组:

func zigzag<T>(through arrays: [[T]]) -> [T] {
    var result = [T]()
    var index = 0

    while true {
        var didAppend = false
        for array in arrays {
            if index < array.count {
                result.append(array[index])
                didAppend = true
            }
        }
        if didAppend == false { break }
        index += 1
    }

    return result
}

例如:

zigzag(through: [[11, 12], [21, 22, 23, 24], [31, 32, 33]])

//[11, 21, 31, 12, 22, 32, 23, 33, 24]

【讨论】:

  • 我认为这是一个非常好的答案,只有一个例外,一个 for 循环迭代一个序列而不是一个范围。范围是一个序列,但还有其他的,包括作为元组的序列。
  • @MichaelSalmon 感谢您的提醒!
  • 感谢您的详尽回复!!非常感谢。 @ielyamani
  • @ielyamani 我刚刚发现 for 循环可以有一个 where 子句,当你有一个带有单个 if 的 for 循环时,它的效果非常好。指南中没有提到它,但它在参考中。恕我直言,它更容易阅读并节省一定程度的缩进。
【解决方案3】:

您可以使用firstArray.indices,它是一个范围或0..&lt;firstArray.count,尽管这并不总是有效,因为并非所有数组都从 0 开始并且计数可能很昂贵。 firstArray.count - 1 是单个值,而不是值序列。您还可以执行let names: [String] = firstArray.indices.map { firstArray[$0] + secondArray[$0] } 之类的操作,恕我直言真的很酷。

【讨论】:

  • 感谢@Micheal Salmon 花时间回复。不幸的是,代码抛出了一个错误。 EXC_BAD_INSTRUCTION (Code=EXC_I386_INVOP, subcode=0x0)..... 这是代码 >>>>> import UIKit var firstArray = ["John", "Tim"] var secondArray = ["Smith"] for i in firstArray .indices { let names = firstArray[i] + secondArray[i] } 有什么建议吗?我也试过 let names: [String] = firstArray.indices.map { firstArray[$0] + secondArray[$0] } 无济于事。
  • 我比我更喜欢 zip 解决方案。
  • 我在 Swift Playground 中运行了代码,包括 for 循环和地图。两者都运行没有问题。顺便说一下,您的示例有一个错误, secondArray 只有一个条目。
  • 感谢您的帮助@MichealSalmon。我不确定被评估的两个数组是否需要具有相同数量的条目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多