我有一个NSMutableArray
按特定顺序包含十个自定义对象。
我需要重新排列对象,以便数组的后半部分与前半部分交错:
之前:1,2,3,4,5,6,7,8,9,10 之后:1,6,2,7,3,8,4,9,5,10
我该如何做到这一点?
答案 0 :(得分:1)
(void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2
(无效)sortUsingComparator:(NSComparator)CMPTR
答案 1 :(得分:1)
您正在寻找的是shuffle
(想想洗牌一副牌 - 相同的数据,不同的顺序)。以下方法可用于swap two objects within a mutable array.
- (void)exchangeObjectAtIndex:(NSUInteger)idx1
withObjectAtIndex:(NSUInteger)idx2
在修改数组时,不能枚举数组,并且我也不会循环遍历数组的元素。相反,使用索引创建一个for循环并使用arc4random生成第二个交换索引。
for (NSUInteger n = 0; n < array.count; n++) {
NSUInteger m = arc4random_uniform(array.count);
[array exchangeObjectAtIndex:n withObjectAtIndex:m];
}
可以添加更复杂的内容,例如检查是否n == m
或否定某种偏见,但这应该会让你成为一个&#34;大多数&#34;原始数组的随机抽样。
[夫特]
Swift exchange方法在可变数组中交换两个项目。 func exchangeObjectAtIndex(_ idx1:Int, withObjectAtIndex idx2:Int)
用户Nate Cook提供了几个好shuffling methods for Swift
here.我在这里复制他的变异Array方法,因为它最接近上述Objective-C方法。
extension Array {
mutating func shuffle() {
for i in 0..<(count - 1) {
let j = Int(arc4random_uniform(UInt32(count - i))) + i
exchangeObjectAtIndex(i, withObjectAtIndex: j)
}
}
}
var numbers = [1, 2, 3, 4, 5, 6, 7, 8]
numbers.shuffle()
答案 2 :(得分:0)
为什么不创建第二个NSArray,在其中按您想要的顺序放置值?之后,如果您想使用第一个数组,则从中删除所有项目
[firstArray removeAllObjects];
然后将项目放回第二个数组:
for (int i = 0; i < [secondArray count]; i++)
{
[firstArray addObject: [secondArray objectAtIndex:i]];
}