创建一个数组,按字母顺序删除重复的名称

时间:2011-11-02 10:04:23

标签: iphone objective-c xcode

我有一个包含条目词典的NSMutableArray。每个条目都有几个键,其中一个是“Title”,其中包含一个名称字符串。

数据模型中有许多重复项,因为某些条目与不同的部分相关。例如,“流感”可能在“发烧”或“疼痛和疼痛”下找到。所以,现在我有一个键值对,有两个名为“流感”的条目作为标题。

在TableViewController中实现搜索时,如果我输入“Influenza”,我会得到重复项。为了删除它们,我尝试了以下内容:

self.searchEntries = [[NSSet setWithArray:entries]allObjects];
[searchEntries sortedArrayUsingSelector:@selector(compareName:)];

然而,这似乎没有做任何有用的事情。我仍然得到重复,列表不按字母顺序排列。

任何人都可以帮我解决这个看似简单的问题吗?

3 个答案:

答案 0 :(得分:1)

您的副本是否真的重复?或者是否有任何特殊字符/大写字母?

要进行排序,您必须

searchEntries = [searchEntries sortedArrayUsingSelector:@selector(compareName:)];

因为- sortedArrayusingSelector:将返回NSArray。

<强>更新 由于entries包含NSDictionary类型的元素,因此您可以获得唯一的&amp;排序数组如下:

searchEntries = [entries valueForKeyPath:@"@distinctUnionOfObjects.title"];
searchEntries = [searchEntries sortedArrayUsingSelector:@selector(compare:)];

请注意,searchEntries现在只包含标题值(如果您只想在tableView中显示它们,则可能没问题。)

答案 1 :(得分:1)

我希望这段代码对你有帮助

NSSet *uniqueElements = [NSSet setWithArray:myArray];

// iterate over the unique items
for(id element in uniqueElements) {
  // do something
}
祝你好运

答案 2 :(得分:0)

首先,数组中的对象都需要响应您选择的选择器。据我所知,NSDictionary不响应compareName:

其次,sortedArray ...方法创建一个全新的数组。 NSMutableArray有一些in place sort methods

如果您有一个可变数组-sortUsingComparator:,可能最简单的方法就是使用。

[[self searchEntries] sortUsingComparator: ^(id obj1, id obj2)
    {
        return [[obj1 title]  compare: [obj2 title]];
    }];

如果你有一个不可变数组

sortedArray = [[self searchEntries] sortedArrayUsingComparator: ^(id obj1, id obj2)
              {
                  return [[obj1 title]  compare: [obj2 title]];
              }];