iOS中对字典进行排序

来源:互联网 发布:mmd怎么载人动作数据 编辑:程序博客网 时间:2024/05/10 03:55

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 < count; i++){[indentString appendFormat:@"    "];}NSMutableString *description = [NSMutableString string];[description appendFormat:@"%@{\n", indentString];for (NSObject *key in self){[description appendFormat:@"%@    %@ = %@;\n",indentString,DescriptionForObject(key, locale, level),DescriptionForObject([self objectForKey:key], locale, level)];}[description appendFormat:@"%@}\n", indentString];return description;}@end

先看一段代码

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);    }

结果一目了然啦,大家快去使用吧~ 哈哈


源码:字典排序   参考文章:http://www.cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html

1 0
原创粉丝点击