arrays - 将恰好 2 个相等的元素添加到数组中

标签 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、...、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])
        }
    }
}

这可以毫无问题地扩展到更大的数组和更多的重复 元素。

关于arrays - 将恰好 2 个相等的元素添加到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29783579/

相关文章:

java - 重复 Java 数组

python - 将数字输入数组

ios - 迦太基更新 - 任务失败,退出代码 65

ios - 在 RxSwift 中点击按钮不会在平面 map 范围内调用 Moya 网络请求

创建一个 void* 数组,每个数组都指向 2d int 矩阵?

javascript - 在大量数字中搜索第一个重复元素

ios - 无法将类型 '(Int) -> Void' 的值转换为预期的参数类型 '(Any) -> Void'

c# - 我如何获得完成在其属性值中建立的要求的所有类属性?

android - 使用 ant 构建 Android 测试时如何使用 emma 过滤器?

r - R 数据集中的 TextInput 过滤器 Shiny