当前位置:  开发笔记 > 编程语言 > 正文

需要一种算法来混淆5个数组的元素,每个数组具有相同的5个元素,这样两个数组在同一个索引中没有相同的元素

如何解决《需要一种算法来混淆5个数组的元素,每个数组具有相同的5个元素,这样两个数组在同一个索引中没有相同的元素》经验,为你挑选了1个好方法。

这是图像我有以下五个阵列

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中.请帮我整理算法,排列五个阵列的元素.

谢谢



1> dfri..:

既然你知道阵列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中对数组进行洗牌?


@ user3441734但是OP不想要完全随机的数组.他希望每个元素相对于其他数组具有不同的索引.
推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有