将2个相等的元素添加到数组中

时间:2015-04-21 21:37:28

标签: arrays swift filter duplicates

我正在尝试将随机数(1 ... 8)添加到数组中。 我想这样做16次。线索是,每个数字应该只在那里两次。我到目前为止工作,但我不认为这是一个干净的方法。而我的方式,它是不可扩展的。如果我想要它,让我们说例如24个元素,并且所有它们都是3次,我必须重写所有代码。你知道如何解决这个问题吗?提前谢谢!

var Numbers: [Int] = []
var randomNumber: Int = 0
let size: Int = 16

var index1 = 0
var index2 = 0
var index3 = 0
var index4 = 0
var index5 = 0
var index6 = 0
var index7 = 0
var index8 = 0

// Methods / Functions

func createRandomNumber() {

    randomNumber = Int(arc4random() % 8 + 1)
}

func checkTwins() {

    switch randomNumber {
    case 1:
        index1++
        if index1 <= 2 {
            Numbers.append(randomNumber)
        }
        else {
            addRandomNumbertoArray()
        }
    case 2:
        index2++
        if index2 <= 2{
            Numbers.append(randomNumber)
        }
        else {
            addRandomNumbertoArray()
        }
    case 3:
        index3++
        if index3 <= 2 {
            Numbers.append(randomNumber)
        }
        else {
            addRandomNumbertoArray()
        }
    case 4:
        index4++
        if index4 <= 2 {
                Numbers.append(randomNumber)
        }
        else {
            addRandomNumbertoArray()
        }
    case 5:
        index5++
        if index5 <= 2 {
                Numbers.append(randomNumber)
        }
        else {
            addRandomNumbertoArray()
        }
    case 6:
        index6++
        if index6 <= 2 {
                Numbers.append(randomNumber)
        }
        else {
            addRandomNumbertoArray()
        }
    case 7:
        index7++
        if index7 <= 2 {
                Numbers.append(randomNumber)

        }
        else {
            addRandomNumbertoArray()
        }
    case 8:
        index8++
        if index8 <= 2 {
                Numbers.append(randomNumber)

        }
        else {
            addRandomNumbertoArray()
        }

    default: println("Generated Number out of Index")
    }
}

func addRandomNumbertoArray() {
    createRandomNumber()
    checkTwins()
}

func fillUpArray() {

    for _ in 1...size {
        addRandomNumbertoArray()
    }
}

// Calls

fillUpArray()
println(Numbers)

这是用Swift Playground编写的

1 个答案:

答案 0 :(得分:1)

你可以做的是:首先填充一个包含每个的数组 数字1,...,8两次:

var array : [Int] = []
for i in 1 ... 8 {
    array.extend(Repeat(count: 2, repeatedValue: i))
}

然后随机随机播放数组:

array.shuffle()

其中shuffle()Fisher-Yates shuffle。 可以在中找到Swift实现 How do I shuffle an array in Swift?

extension Array {
    mutating func shuffle() {
        for i in 0..<(count - 1) {
            let j = Int(arc4random_uniform(UInt32(count - i))) + i
            swap(&self[i], &self[j])
        }
    }
}

这可以毫无问题地扩展到更大的阵列并且更多重复 元件。