【问题标题】:Swift Joining 2 Arrays in Specific OrderSwift 以特定顺序连接 2 个数组
【发布时间】:2017-01-07 04:36:36
【问题描述】:

我在操场上写了以下代码,它运行良好,但看起来有点乱。有没有更简洁的 Swift 编写方式?

我希望字符串如下所示: 1、12、2、12、3、12、4、13、5、13、6、13、7、14、8、14

我不会知道每个数组中有多少个值,数组可能不是偶数,但我会知道每个array2值的3个array1值的关系

let array1 = [1,2,3,4,5,6,7,8]  //sample 1st array
let array2 = [12,13,14]         //sample 2nd array

let relationshipInterval = 3
let remainder = (array1.count % relationshipInterval)
let multiples = (array1.count - remainder)/relationshipInterval
var string = ""
var array1Start = 0
var array1End = relationshipInterval-1
var array2Value = 0

for _ in 1...multiples {
    for array1value in array1[array1Start...array1End] {
    string += "\(array1value), "
    string += String(array2[array2Value])+", "
    }
    array1Start = array1End + 1
    array1End = array1Start + relationshipInterval - 1
    array2Value += 1
}

for array1value in array1[array1Start...array1Start+remainder-1] {
        string += "\(array1value), "
        string += String(array2[array2Value])+", "
}
print (string)  //prints 1, 12, 2, 12, 3, 12, 4, 13, 5, 13, 6, 13, 7, 14, 8, 14

【问题讨论】:

标签: arrays swift loops


【解决方案1】:

我不确定这是否涵盖了所有用例,但使用 zipflatMapjoined 只需一步!

let array1 = [1,2,3,4,5,6,7,8]
let array2 = [12, 13, 14]

let text = zip(array1, array2.flatMap({ [$0, $0, $0] }))
    .flatMap({ [$0, $1] })
    .map({ String($0) })
    .joined(separator: ", ")

// text -> "1, 12, 2, 12, 3, 12, 4, 13, 5, 13, 6, 13, 7, 14, 8, 14"

这是一个分为四个步骤的单行代码,以便更清楚地了解每个阶段发生的情况:

// 1. create an array with each element in array2 is trippled:
let trippled = array2.flatMap({ item in
    return [item, item, item]
})
// trippled -> [12, 12, 12, 13, 13, 13, 14, 14, 14]

// 2. zip array1 with the trippled array:
let zipped = zip(array1, trippled)
// zipped -> Zip2Sequence(_sequence1: [1, 2, 3, 4, 5, 6, 7, 8], _sequence2: [12, 12, 12, 13, 13, 13, 14, 14, 14])

// 3. flatten the zipped aray
let combined = zipped.flatMap({ leftItem, rightItem in
    return [leftItem, rightItem]
})
// combined -> [1, 12, 2, 12, 3, 12, 4, 13, 5, 13, 6, 13, 7, 14, 8, 14]

// 4. tranform to a string
let text = combined.map({ item in
    return "\(item)"
}).joined(separator: ", ")
// text -> "1, 12, 2, 12, 3, 12, 4, 13, 5, 13, 6, 13, 7, 14, 8, 14"

【讨论】:

  • 那是完美的。我知道必须有更好的方法。我对平面图知之甚少,但我发现它在很多情况下让事情变得更加简洁。谢谢。
  • 如果我希望比率为 50:1,是否有一种缩短的方法可以将 [$0,$0...] 写成 50 次?
  • 是的! Array<Int>(repeating: $0, count: 3) 是实现[$0, $0, $0] 的另一种方法,因此您可以使用它,但改为输入count: 50
猜你喜欢
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
相关资源
最近更新 更多