我有以下五个阵列
var E1 = ["A", "B", "C", "D", "E"] var E2 = ["A", "B", "C", "D", "E"] var E3 = ["A", "B", "C", "D", "E"] var E4 = ["A", "B", "C", "D", "E"] var E5 = ["A", "B", "C", "D", "E"]
每个阵列具有相同的五个元素,即"A","B","C","D"和"E".我想编写一个算法来对所有数组中的元素进行排序,这样两个数组在同一个索引上就没有相同的元素(比如说"A").
一种对我有用的样本输出将是:
var E1 = ["A", "B", "C", "D", "E"] var E2 = ["B", "C", "D", "E", "A"] var E3 = ["C", "D", "E", "A", "B"] var E4 = ["D", "E", "A", "B", "C"] var E5 = ["E", "A", "B", "C", "D"]
我试图解决这个问题,但无法完成.我刚刚写了一个shuffling函数来排序两个数组(E1和E2)的元素.
var E1 = ["A", "B", "C", "D", "E"] var E2 = ["A", "B", "C", "D", "E"] var E3 = ["A", "B", "C", "D", "E"] var E4 = ["A", "B", "C", "D", "E"] var E5 = ["A", "B", "C", "D", "E"] func shuffledArrays(var array1: [String],var array2: [String]) { if array1[0] == array2[0] || array1[1] == array2[1] || array1[2] == array2[2] || array1[3] == array2[3] || array1[4] == array2[4] { shuffled1 = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(array1) shuffled2 = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(array2) var array3 = shuffled1 as! [String] var array4 = shuffled2 as! [String] } else { var array3 = array1 var array4 = array2 } array1 = array3 array2 = array4 } // Now calling the function on arrays E1 and E2 shuffledArrays(E1, array2: E2) print(E1) print(E2)
使用此代码,我在Xcode Playground上收到以下错误.虽然有时错误被删除并且输出在第102和103行是正确的,但我仍然无法提取输出并将其永久保存到E1和E2中.请帮我整理算法,排列五个阵列的元素.
谢谢
既然你知道阵列E1
,...,E5
持有相同的条目(在相同的顺序),你不必明确保持阵列E2
通过E5
(因为你知道这些都是价值相等E1
).
因此,您可以简单地定义一个移位函数,并E2
通过E5
重复移动前一个数组来创建.
import GameplayKit func shiftByOne (arr: [String]) -> [String] { var shiftedArr = arr shiftedArr.insert(shiftedArr.popLast()!, atIndex: 0) return shiftedArr } var E1 = ["A", "B", "C", "D", "E"] E1 = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(E1) as! [String] var E2 = shiftByOne(E1) var E3 = shiftByOne(E2) var E4 = shiftByOne(E3) var E5 = shiftByOne(E4) /** Result without initial shuffle: E1 = ["A", "B", "C", "D", "E"] E2 = ["B", "C", "D", "E", "A"] E3 = ["C", "D", "E", "A", "B"] E4 = ["D", "E", "A", "B", "C"] E5 = ["E", "A", "B", "C", "D"] */
此方法以E1
(可能仅对此数组进行洗牌)开始,并保证E2
通过构造为E5
彼此之间的所有不同,按顺序.
正如下面的R Menke所指出的,如果你E1
改组数组,相同的行为将保持不变(但是随着初始数组的混乱).在这里,我使用了与您的示例中相同的shuffler,但是对于更多Swifty
方法,请参阅例如:
如何在Swift中对数组进行洗牌?