将一个数组中的对象随机替换为另一个数组.Swift 4



两个阵列

let array1 = ["A","B","C","D","E","F","G"]
let array2 = ["a","b","c","d","e","f","g"]

我想从array2中选择一个索引,并用array2中的对象替换array1中同一索引处的对象。例如

array1[3] = array2[3] //["A","B","C","d","E","F","G"]

我想随机地这样做,例如

let randomIndex: Int = Int(arc4random()) % (array2.count)

我想在"for"循环中执行此操作,直到array2的所有索引和对象都被使用为止,但我不想重复randomIndex。

如果我在每次迭代后减少对象的数量,我仍然可以得到相同的随机索引。如果我使用一组索引,并删除使用过的索引,我就会失去"有序性"(如果这是一个词的话(。

所以我好像被卡住了。BTW swift 4的.randomElement在字符串数组上不起作用。

有什么想法吗?

for object in array2 {
let randomIndex: Int = Int(arc4random()) % (array2.count)
array1[randomIndex] = array2[randomIndex]
array2.remove(at: randomIndex)
}

以上内容并非如我所愿。当对象被移除时,就会建立一个新的顺序,并且我无法在适当的索引处替换array1中的对象。

我错过了一些明显的东西,但我没有看到。我正在使用Swift 4.2。

这看起来效率很低,但有效:

let array1 = ["A","B","C","D","E","F","G"]
let array2 = ["a","b","c","d","e","f","g"]
var array3 = array1                       // ["A","B","C","D","E","F","G"]
var counterSet = Set<Int>()               // empty set
while counterSet.count < array2.count {
let randomIndex: Int = Int(arc4random()) % (array2.count)    //(16 times)
counterSet.insert(randomIndex)                               //(16 times)
array3[randomIndex] = array2[randomIndex]                    //(16 times)
}
counterSet                                // {2, 4, 6, 5, 0, 1, 3}
array3                                    // ["a", "b", "c", "d", "e", "f", "g"]

我还是想要一些意见。感谢Kurt

是否需要混洗索引?如果是这样,下面的代码就完成了任务。

( 0 ..< array2.count ).shuffled()

Array( stride( from: 0, through: array2.count - 1, by: 1 ) ).shuffled()
var array1  = ["A","B","C","D","E","F","G"]
var array2  = ["a","b","c","d","e","f","g"]
let randomIndex: Int = Int(arc4random()) % (array2.count)
print("Number:(randomIndex)")
array2.insert(array1[randomIndex], at: randomIndex)
print("array2:(array2)")

最新更新