arrays - 如何在 Swift 中将数组拆分为元素数量始终不同的部分?

标签 arrays swift

我有一个具有不同颜色形状的数组。我需要将一个数组拆分为多个数组,而不重复元素的数量。现在我正在使用:

    extension Array {
    func split(into size: Int) -> [[Element]] {
            return (0..<size).map {
                stride(from: $0, to: count, by: size).map { self[$0] }
            }
        }
}

结果有时可能是这样的:[[8],[8],[4]] 或 [[6],[3],[6]] 需要:[[9],[7],[4]]和[[5],[4],[6]]

编辑: 这就是返回具有形状的数组的函数的样子

fileprivate func getTreasureElements(totalCount: Int,
                                         colors: [MysteriosTreasureElementColor],
                                         colorsCount: Int,
                                         figuresCount: Int) -> [MysteriosTreasureElement] {

        var elements: [MysteriosTreasureElement] = []
        let circleFigure = MysteriosTreasureElementFigure.circle
        let randomColor = MysteriosTreasureElementColor.allCases.randomElement()!
        let randomFigure = MysteriosTreasureElementFigure.allCases.randomElement()!

        let newElement = MysteriosTreasureElement(icon: UIImage(named: "treasureIcon_\(randomColor)_\(circleFigure)")!,
                                               color: randomColor,
                                               figure: randomFigure)
        for _ in 0...totalCount+1 {
            elements.append(newElement)
        }
        var chunkedElements = elements.split(into: colorsCount)
        var result: [MysteriosTreasureElement] = []
        switch colorsCount {
        case 2:
            
            chunkedElements[0] = randomizeFigures(count: chunkedElements[0].count,
                                                  color: colors[0])
            
            chunkedElements[1] = randomizeFigures(count: chunkedElements[1].count,
                                                  color: colors[1])
            result = Array(chunkedElements.joined())
        case 3:
            chunkedElements[0] = randomizeFigures(count: chunkedElements[0].count,
                                                  color: colors[0])
            chunkedElements[1] = randomizeFigures(count: chunkedElements[1].count,
                                                  color: colors[1])
            chunkedElements[2] = randomizeFigures(count: chunkedElements[2].count,
                                                  color: colors[2])
            result = Array(chunkedElements.joined())
            
        case 4:
            chunkedElements[0] = randomizeFigures(count: chunkedElements[0].count,
                                                  color: colors[0])
            chunkedElements[1] = randomizeFigures(count: chunkedElements[1].count,
                                                  color: colors[1])
            chunkedElements[2] = randomizeFigures(count: chunkedElements[2].count,
                                                  color: colors[2])
            chunkedElements[3] = randomizeFigures(count: chunkedElements[3].count,
                                                  color: colors[3])
            result = Array(chunkedElements.joined())
            
        case 5:
            chunkedElements[0] = randomizeFigures(count: chunkedElements[0].count,
                                                  color: colors[0])
            chunkedElements[1] = randomizeFigures(count: chunkedElements[1].count,
                                                  color: colors[1])
            chunkedElements[2] = randomizeFigures(count: chunkedElements[2].count,
                                                  color: colors[2])
            chunkedElements[3] = randomizeFigures(count: chunkedElements[3].count,
                                                  color: colors[3])
            chunkedElements[4] = randomizeFigures(count: chunkedElements[4].count,
                                                  color: colors[4])
            
            result = Array(chunkedElements.joined())
            
        default:
            break
        }
        while result.count > totalCount {
            result.removeLast()
        }
        return result.shuffled()
    }

最佳答案

创建唯一项的随机数组的常用方法是制作源数组的可变副本。然后获取一个随机索引,将给定索引处的项目添加到结果数组中,并从临时数组中删除该项目。

例如

let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

func randomArray(ofSize size: Int) -> [Int] {
    if size >= array.count { return array.shuffled() }
    var tempArray = array
    return (0..<size).map { _ in tempArray.remove(at: Int.random(in: 0..<tempArray.count)) }
}


randomArray(ofSize: 5)

您可以将巨大的 switch 语句替换为

if (2...5).contains(colorsCount) {
    (0..<colorsCount).forEach { i in
        chunkedElements[i] = randomizeFigures(count: chunkedElements[i].count,
                                                     color: colors[i])
    }
    result = Array(chunkedElements.joined())
}

关于arrays - 如何在 Swift 中将数组拆分为元素数量始终不同的部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73782125/

相关文章:

ios - 我的视频离开屏幕,但留在它的 UIView 中

swift - 将视频从 UIPickerViewController 压缩到以 MB 为单位的特定大小,以便在 Swift 2 中联网

c++ - 如何加速非顺序数组填充?

javascript - 使用正则表达式将字符串与数组匹配

python - 我可以在一个 numpy 操作中使用 "rotate"和 slice 吗?

ios - 'didSelectRowAt' 未被调用

arrays - 将数组的元素转换为单独的字符串

arrays - 如何将csv文件读入scala中的数组数组

ios - Swift 3.0 中的结构枚举

swift - 为什么 Swift 不能在这里推断类型?