iOS中对字典进行排序

iOS中字典实际上是无序的,那么如果我们要对字典进行排序要怎么做呢?

代码如下:

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
<span style="font-size:18px;">  
 
@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  
</span>  

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
<span style="font-size:18px;">  
 
#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  
</span>  

先看一段代码
[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
<span style="font-size:18px;">  
 
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);  
    }  
</span>  




这个结果可以看到和我们实际存入字典的顺序是不一样的

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
<span style="font-size:18px;">  
 
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);  
    }</span>  

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



源码:字典排序   参考文章:http://www.cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值