iOS中对字典进行排序

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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值