【问题标题】:Help Sorting NSArray帮助排序 NSArray
【发布时间】:2010-08-01 16:36:25
【问题描述】:

在我的项目中,我遍历了一堆 sql 记录并为 NSMutableDictionary 填充了每个键的字符串。键很重要,因为我将它们用作 TableView 中的部分标题。

我遇到的问题是我希望这些部分按特定顺序排列。当我调用 allKeys 时,键的顺序与它们进入 NSMutableDictionary 的顺序不同。我或多或少明白为什么。我的问题是如何使某些值(非字母顺序)先出现在其余值之前。

示例字符串:'Blue'、'Brown'、'Green'、'Orange'、'Purple'、'Red'、'Violet'、'Yellow'...

我希望看到它们按如下顺序排列:'Red'、'Green'、'Blue'、'Brown'、'Orange'、'Purple'、'Red'、'Violet'

重要的部分是“'Red', 'Green', 'Blue'”,所有其他值都可以在这三个值后面按字母顺序排列。

我唯一能想到的就是通过说“sortedArrayUsingSelector:@selector(compare:)”按字母顺序对它们进行排序,然后尝试删除我正在寻找的字符串并将它们放回一个较小的索引值,如果它们存在。有更好的想法吗?我不确定这有多有效。

【问题讨论】:

    标签: objective-c sorting nsarray


    【解决方案1】:

    您的方法似乎没问题。使用“库存方法”是一个不错的选择。由于您无法对键的顺序做出假设,因此这是要走的路。

    【讨论】:

    • 尝试了我的想法,但并没有像我希望的那样成功。 NSMutableDictionary 没有按照我在索引中指定的顺序保存它们。
    • NM,我明白了。由于我循环的方式,我收到了一个奇怪的订单。现在好了。
    【解决方案2】:

    这是我想出的方法。同样,我不确定它的效率如何,但它适用于我的目的。

    -(NSArray *)rearrangeSections:(NSArray *)s {
        NSArray *topSections = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", nil];
    
        NSArray *reversedTopSections = [[topSections reverseObjectEnumerator] allObjects];
        NSArray *alphabetizedArray = [s sortedArrayUsingSelector:@selector(compare:)];
        NSMutableArray *sections = [NSMutableArray arrayWithArray:alphabetizedArray];
    
        //Loop through our list of sections and place them at the top of the list.
        for (NSString *sectionTitle in reversedTopSections) {
            if ([sections containsObject:sectionTitle]) {
                [sections removeObject:sectionTitle];
                [sections insertObject:sectionTitle atIndex:0];
            }
            //NSLog(@"%@", sections);
        }
    
        NSArray *sortedSections = [NSArray arrayWithArray:sections];
        return sortedSections;
    }
    

    【讨论】: