我有一个具有不同颜色形状的数组。我需要将一个数组拆分为多个数组,而不重复元素的数量。现在我正在使用:
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/