iOS中字典实际上是无序的,那么如果我们要对字典进行排序要怎么做呢?
代码如下:
@interface OrderedDictionary : NSMutableDictionary
{
NSMutableDictionary *dictionary;
NSMutableArray *array;
}
//插入一个位置
- (void)insertObject:(id)anObject forKey:(id)aKey atIndex:(NSUInteger)anIndex;
//取得某个位置的obj
- (id)keyAtIndex:(NSUInteger)anIndex;
//逆序
- (NSEnumerator *)reverseKeyEnumerator;
//顺序
- (NSEnumerator *)keyEnumerator;
@end
#import "OrderedDictionary.h" NSString *DescriptionForObject(NSObject *object, id locale, NSUInteger indent) { NSString *objectString; if ([object isKindOfClass:[NSString class]]) { objectString = (NSString *)[[object retain] autorelease]; } else if ([object respondsToSelector:@selector(descriptionWithLocale:indent:)]) { objectString = [(NSDictionary *)object descriptionWithLocale:locale indent:indent]; } else if ([object respondsToSelector:@selector(descriptionWithLocale:)]) { objectString = [(NSSet *)object descriptionWithLocale:locale]; } else { objectString = [object description]; } return objectString; } @implementation OrderedDictionary //初始化方法 - (id)init { return [self initWithCapacity:0]; } //初始化方法 - (id)initWithCapacity:(NSUInteger)capacity { self = [super init]; if (self != nil) { dictionary = [[NSMutableDictionary alloc] initWithCapacity:capacity]; array = [[NSMutableArray alloc] initWithCapacity:capacity]; } return self; } //析构方法 - (void)dealloc { [dictionary release]; [array release]; [super dealloc]; } //copy方法 - (id)copy { return [self mutableCopy]; } //复写方法 - (void)setObject:(id)anObject forKey:(id)aKey { if (![dictionary objectForKey:aKey]) { [array addObject:aKey]; } [dictionary setObject:anObject forKey:aKey]; } - (void)removeObjectForKey:(id)aKey { [dictionary removeObjectForKey:aKey]; [array removeObject:aKey]; } - (NSUInteger)count { return [dictionary count]; } - (id)objectForKey:(id)aKey { return [dictionary objectForKey:aKey]; } - (NSEnumerator *)keyEnumerator { return [array objectEnumerator]; } - (NSEnumerator *)reverseKeyEnumerator { return [array reverseObjectEnumerator]; } - (void)insertObject:(id)anObject forKey:(id)aKey atIndex:(NSUInteger)anIndex { if ([dictionary objectForKey:aKey]) { [self removeObjectForKey:aKey]; } [array insertObject:aKey atIndex:anIndex]; [dictionary setObject:anObject forKey:aKey]; } - (id)keyAtIndex:(NSUInteger)anIndex { return [array objectAtIndex:anIndex]; } //返回一个字符串对象,该对象代表了字典的内容,格式的属性列表。 - (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level { NSMutableString *indentString = [NSMutableString string]; NSUInteger i, count = level; for (i = 0; i 先看一段代码
NSMutableDictionary *dict2 = [[NSMutableDictionary alloc]initWithCapacity:0]; [dict2 setObject:@"one" forKey:@"1"]; [dict2 setObject:@"two" forKey:@"2"]; [dict2 setObject:@"four" forKey:@"4"]; [dict2 setObject:@"three" forKey:@"3"]; for (NSString *str in [dict2 allKeys]) { NSLog(@"key == %@",str); }
这个结果可以看到和我们实际存入字典的顺序是不一样的
OrderedDictionary *dict = [[OrderedDictionary alloc]initWithCapacity:0]; [dict setObject:@"two" forKey:@"2"]; [dict setObject:@"four" forKey:@"4"]; [dict setObject:@"three" forKey:@"3"]; [dict setObject:@"one" forKey:@"1"]; [dict insertObject:@"five" forKey:@"5" atIndex:0]; NSEnumerator *enumerator2 = [dict keyEnumerator]; id obj; while(obj = [enumerator2 nextObject]) { NSLog(@"%@",obj); }