2012-08-31 107 views
0

我想排序我的数组.... 在我的数组元素是在这个顺序dateArray {0,1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16,17,18,19,32,33,34,35,36,37,38,39,40,41}iPhone排序阵列

但我想这个数组以相反的顺序 我用这个代码逆转..

dateArray=[[NSMutableArray alloc]initWithArray:[[date reverseObjectEnumerator] allObjects]]; 

但它给这个输出

dateArray=(
9, 
8, 
7, 
6, 
5, 
4, 
3, 
2, 
19, 
18, 
17, 
16, 
15, 
14, 
13, 
12, 
11, 
10, 
1, 
0 
) 

但我想这个输出dateArray(19,18,17,16,15,14,1 3,12,11,10 ........ 2,1,0) 我也使用排序方法,但输出是一样的。我怎样才能做到这一点???请帮助

编辑:

我的数组元素是NSDocument目录的内容....

解决 这个问题已经sovled。我不知道如何排序我的数组的确切方式,但我更改了我的子路径名称。它给右输出..

由于提前

+0

它似乎是基于'NSString'而不是'NSNumber'进行排序。我建议你使用类似'sortUsingComparator:'的东西。 – Mazyod

+0

Thanx的答复,我现在试试.. – Rox

+0

如果你想使用字符串而不是数字,你应该使用以下格式的正确排序:'20','19',...' 10','09','08',...'02','01','00',因此,您只需为每个数字添加前导'0'。 – holex

回答

1

,如果你想使用字符串代替数字工作,你应该使用以下格式进行正确的排序:

2019,... 100908。 ... 0201,00

因此,你只需要添加领先的0到每一个数字。如果它们是字符串,那么可以只将它们排序为字符串,而不是数字,这就是为什么需要前导零。


的最无痛的解决方案是重命名的子路径那么,这里的字符串来,你不需要改变任何东西在你的申请得到正确顺序的方式。

1

你需要使用

-[NSArray sortedArrayUsingSelector:] 

-[NSMutableArray sortUsingSelector:],并通过@selector(比较:)作为参数。

+0

啊,我没有得到。 PLZ解释如何做? – Rox

2

我假设你的数组包含对象而不是你的问题中的数字。以下是按升序或降序对数组排序的示例。

NSArray *array = [[NSArray alloc] initWithObjects:@"5",@"1",@"0",@"3",@"2",@"4", nil]; 

//or 

NSArray *array = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:5], [NSNumber numberWithInt:1], [NSNumber numberWithInt:0], [NSNumber numberWithInt:3], [NSNumber numberWithInt:2], [NSNumber numberWithInt:4], nil]; 


NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:nil ascending:NO]; //YES, for ascending 
NSLog(@"Sorted array %@",[array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sort, nil]]); 
+0

对不起,它给出了相同的输出。 – Rox

+0

@Rox,看到这个编辑的数据!这个对我有用!让我知道你的数据的类型是什么,它们是对象(字符串)还是类型号码? – Hemang

+0

它排序你的元素,但如果从1到20的UR元素,那么它给这个输出dateArray =(9,8,7,6,5,4,3,2,19,18,17,16,15,14, 13,12,11,10,1,0)...但我想像系列(20,19,... 2,1,0) – Rox

1

三种方式(其他很多,我相信)。 最简单的方法(thanks to this SO question),是使用reverseObjectEnumerator:

NSArray *dateArrayReversed = [[dateArray reverseObjectEnumerator] allObjects]; 

或者你可以使用一个排序描述符(乱):

NSArray *arrayOne = [NSArray arrayWithObjects:@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19, nil]; 

NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self" ascending: NO]; 
    NSArray *arrayTwo = [arrayOne sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]]; 

的另一种方法是创建对反式阵列的类别。请参阅this SO问题就是一个很好的例子。

How can I reverse a NSArray in Objective-C?

+0

我已经尝试了上面两种方式..但没有得到我想要的.... – Rox

1

这可以很容易做到,你可以通过排序您NSSortDescriptor阵列,但有一个小窍门,我会展示给you.Here是代码

NSMutableArray *yourArray=[[NSMutableArray alloc] initWithObjects:@"1",@"5",@"10",@"6",@"3",@"11", nil]; 

NSMutableArray *array=[[NSMutableArray alloc] init]; 
int count=[yourArray count]; 
for (int i=0; i<count; i++) { 
    [array addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:[[yourArray objectAtIndex:i]intValue]],@"val", nil]]; 
} 

if([array count] > 0){ 
    NSSortDescriptor * descriptor = [[[NSSortDescriptor alloc] initWithKey:@"val" 
                   ascending:NO] autorelease]; 
    NSArray * sortedArray = [array sortedArrayUsingDescriptors: 
          [NSArray arrayWithObject:descriptor]]; 
    [array removeAllObjects]; 
    [array addObjectsFromArray:sortedArray]; 
} 
[yourArray removeAllObjects]; 
[yourArray release]; 
NSLog(@"sorted array=%@",array); 

我在做这个是首先将字符串对象以NSNumber形式添加到可变字典中,然后将此字典添加到另一个数组中。现在使用NSSortDescriptor按升序或降序顺序对数组进行排序。