Jam*_*sev 2 sorting objective-c nsmutablearray
晚上好.
这段代码有效.它通过Suit和Card Value对一系列卡片进行排序.这也是非常蛮力.你能推荐一个更好的方法吗?Objective-C是否有助于处理被排序的对象本身有多个字段的情况,排序依赖于哪些字段?
-(void) sort: (NSMutableArray *) deck {
NSUInteger count = [deck count];
Card *thisCard;
Card *nextCard;
int this;
int next;
BOOL stillSwapping = true;
while (stillSwapping) {
stillSwapping = false;
for (NSUInteger i = 0; i < count; ++i) {
this = i;
next = i+1;
if (next < count) {
thisCard = [deck objectAtIndex:this];
nextCard = [deck objectAtIndex:next];
if ([thisCard suit] > [nextCard suit]) {
[deck exchangeObjectAtIndex:this withObjectAtIndex:next];
stillSwapping = true;
}
if ([thisCard suit] == [nextCard suit]) {
if ([thisCard value] > [nextCard value]) {
[deck exchangeObjectAtIndex:this withObjectAtIndex:next];
stillSwapping = true;
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
你有几个选择.
也许最简单的是定义方法-compare:
on Card
,返回一个NSComparisonResult
.如果按诉讼和价值排序是排序a的"标准"方式,这是首选Card
.如果你已经这样做了,那么你的整个排序方法就可以了
[deck sortUsingSelector:@selector(compare:)];
Run Code Online (Sandbox Code Playgroud)
如果你不想这样做,你可以使用一个NSSortDescriptor
s 数组,一个用于套装,一个用于值.
[deck sortUsingDescriptors:[NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"suit" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:@"value"] ascending:YES], nil]];
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因这不起作用,你可以试试 -sortUsingComparator:
[deck sortUsingComparator:^NSComparisonResult(Card *obj1, Card *obj2) {
int suit1 = [obj1 suit];
int suit2 = [obj2 suit];
if (suit1 > suit2) {
return NSOrderedDescending;
} else if (suit1 < suit2) {
return NSOrderedAscending;
} else {
id value1 = [obj1 value];
id value2 = [obj2 value];
if (value1 > value2) {
return NSOrderedDescending;
} else if (value1 < value2) {
return NSOrderedAscending;
} else {
return NSOrderedSame;
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
373 次 |
最近记录: |