2014-10-28 50 views
0

我有一个的NSDictionary数据如下:订单NSArray的使用对象

(lldb) po allFriends 
{ 
    71685207018702188 =  { 
     id = 71685207018702188; 
     name = "mikeziri "; 
     username = mi; 
    }; 
    93374822540641772 =  { 
     id = 93374822540641772; 
     name = "Alan Weclipse"; 
     username = zuka; 
    }; 
    96553685978449395 =  { 
     id = 96553685978449395; 
     name = "Monica Weclipse"; 
     username = amonica; 
    }; 
    96556113096345076 =  { 
     id = 96556113096345076; 
     name = Xavier; 
     username = branko; 
    }; 
    97017008427632119 =  { 
     id = 97017008427632119; 
     name = "Dario Weclipse"; 
     username = tarzan; 
    }; 
} 

我整理基础上,这些对象,如果他们没有,我将使用用户名。要做到这一点,我创建了一个新的的NSDictionaryID,并在方法结束时,我用排序。对它们进行排序的代码如下:

- (NSArray*)orderFriends 
{ 
    NSMutableDictionary* newFriendsDict = [[NSMutableDictionary alloc] init]; 

    for (int i=0; i<[allFriends count];i++) 
    { 
     NSMutableDictionary* friendsDict = [[NSMutableDictionary alloc] init]; 
     NSDictionary* friend = [allFriends objectForKey:[NSString stringWithFormat:@"%@", [sortedKeysFriends objectAtIndex:i]]]; 

     if ([[friend objectForKey:@"name"] length] != 0) 
     { 
      [friendsDict setObject:[friend objectForKey:@"id"] forKey:@"id"]; 
      [friendsDict setObject:[NSString stringWithFormat:@"%@", [friend objectForKey:@"name"]] forKey:@"name"]; 
     } 
     else 
     { 
      [friendsDict setObject:[friend objectForKey:@"id"] forKey:@"id"]; 
      [friendsDict setObject:[NSString stringWithFormat:@"%@", [friend objectForKey:@"username"]] forKey:@"name"]; 
     } 

     [newFriendsDict setObject:friendsDict forKey:[NSNumber numberWithInt:i]]; 
    } 

    NSArray* sp = nil; 
    sp = [[newFriendsDict allValues] sortedArrayUsingComparator:^(id obj1, id obj2){ 
     NSString *one = [NSString stringWithFormat:@"%@", [obj1 objectForKey:@"name"]]; 
     NSString *two = [NSString stringWithFormat:@"%@", [obj2 objectForKey:@"name"]]; 

     return [one compare:two]; 
    }]; 

    return sp; 
} 

的问题是,最终的结果是错误的:

(lldb) po sp 
<__NSArrayI 0x160491a0>(
{ 
    id = 93374822540641772; 
    name = "Alan Weclipse"; 
}, 
{ 
    id = 97017008427632119; 
    name = "Dario Weclipse"; 
}, 
{ 
    id = 96553685978449395; 
    name = "Monica Weclipse"; 
}, 
{ 
    id = 96556113096345076; 
    name = Xavier; 
}, 
{ 
    id = 71685207018702188; 
    name = "mikeziri "; 
}, 
) 
+0

任何时候你使用构造函数'stringWithFormat:@“%@”'你犯了一个错误。除了浪费内存和处理器时间之外,这绝对无所不能。不要这样做。只需使用原始字符串,而不使用stringWithFormat,它只是以一种处理器密集型的方式创建一个不需要的字符串副本。 – 2014-10-29 17:21:48

回答

1

区分大小写。使所有的字符串变小或变大。

1

你也可以只改变
return [one compare:two];

return [one compare:two options: options:NSCaseInsensitiveSearch];

比它会按字母顺序排列,无论大写或小写...

1

几件事情:没有理由建立不同的字典以便进行排序,而好的理由不是这样做。

您已经找到了方法sortedArrayUsingComparator。这需要一个用于比较对象对的块,并返回一个有序数组。您可以使用该方法来实现所需的任何排序标准。

我会建议编写一个比较器块,比较对象的名称属性,除非它是空白的,并使用用户名(如果是空白的话)。它只会是几行代码:

NSArray *sortedFriends = [[allFriends allValues] sortedArrayUsingComparator: 
          ^(NSDictionary *obj1, NSDictionary *obj2) 
{ 
    NSString* key1 = obj1[@"name"] ? obj1[@"name"] : obj1[@"username"]; 
    NSString* key2 = obj2[@"name"] ? obj2[@"name"] : obj2[@"username"]; 
    return [key1 caseInsensitiveCompare: key2]; 
}]; 

编辑:我刚才注意到(从我的文章的编辑)你是从字典,而不是一个数组开始。所以你想要做的是创建一个字典中所有值的排序数组?丢弃字典中所有项目的键是否可以接受,并最终得到一个有序值的数组?

你可以做的另一件事是建立一个字典键数组,根据你的排序标准排序。然后,您可以使用键数组按照排序顺序从字典中提取项目。