如何根据不同 NSArray 中的相同对象顺序将 NSArray 项目分组?
How to sort NSArray items into groups based on the same object order in a different NSArray?
我有一个按正确顺序排序的唯一 UUID 的 NSArray。我还有另一个带有 UUID 编码的书签 NSArray。我想根据书签的 UUID 属性 将我的 NSArray 书签分类。
例如,我有一个 NSArray:@[@"uuid1"、@"uuid3"、@"uuid2"] 已按此特定顺序排序。现在另一个 NSArray 必须按照与上面第一个 NSArray 相同的顺序对其所有书签进行排序。
所以第二个NSArray是:@[@"bookmark1", @"bookmark2", @"bookmark3", ...etc.]
假设书签 1 的 UUID 属性 编码为 uuid2,书签 2 的 UUID 编码为 uuid 1,但书签 3 的编码为 uuid3。我如何对这些书签进行排序和分组,使其成为:@[@"bookmark2"、@"bookmark3"、@"bookmark1"]?
谢谢!
您可以去掉第二个数组,改用字典,它以 UUID 为键。
NSArray *sortedIDs = @[ @"uuid1", @"uuid3", @"uuid2", ];
NSDictionary *items = @{
@"uuid1" : @[ bookmark1 ],
@"uuid2" : @[ bookmark2 ],
@"uuid3" : @[ bookmark3 ],
};
现在当您想要第二个书签时,您可以使用
访问它
NSArray *bookmarksForUUID = items[sortedIDs[1]];
如果您想构建上面的结构,您可以将如下的类别添加到 NSArray
- (NSDictionary *)pas_groupBy:(id (^)(id object))block;
{
NSParameterAssert(block);
NSMutableDictionary *groupedDictionary = NSMutableDictionary.new;
for (id object in self) {
id key = block(object);
if (groupedDictionary[key]) {
[groupedDictionary[key] addObject:object];
} else {
groupedDictionary[key] = [NSMutableArray arrayWithObject:object];
}
}
return groupedDictionary;
}
然后假设您的书签对象类似于
@interface Bookmark : NSObject
@property (nonatomic, copy) NSString *UUID;
// other properties
// other properties
@end
您可以像这样使用类别
NSDictionary *bookmarksMappedBySection = ({
return [bookmarks pas_groupBy:^(Bookmark *bookmark) {
return bookmark.UUID;
};
});
创建一个classBookmark
。将 UUID 和标题作为属性添加到此 class。现在你可以只有一个数组,其中包含 objects of class Bookmark
并且每个数组都可以访问它的 UUID 和标题(以及你以后可能想要添加的任何其他属性) ).
@interface Bookmark: NSObject
@property (nonatomic,strong) NSString *uuid;
@property (nonatomic,strong) NSString *title;
@end
现在,如果您有 NSArray
(我们称之为 myBookmarks
),您可以执行以下操作:
for (Bookmark *bookmark in myBookmarks) {
NSLog(@"my UUID is %@",bookmark.uuid);
NSLog(@"my title is %@",bookmark.title);
}
如果您需要将这些项目存储在NSUserDefaults
中,您所要做的就是采用NSCoding
协议。如果您不知道该怎么做,here 是一个很好的简单示例。
我有一个按正确顺序排序的唯一 UUID 的 NSArray。我还有另一个带有 UUID 编码的书签 NSArray。我想根据书签的 UUID 属性 将我的 NSArray 书签分类。
例如,我有一个 NSArray:@[@"uuid1"、@"uuid3"、@"uuid2"] 已按此特定顺序排序。现在另一个 NSArray 必须按照与上面第一个 NSArray 相同的顺序对其所有书签进行排序。
所以第二个NSArray是:@[@"bookmark1", @"bookmark2", @"bookmark3", ...etc.]
假设书签 1 的 UUID 属性 编码为 uuid2,书签 2 的 UUID 编码为 uuid 1,但书签 3 的编码为 uuid3。我如何对这些书签进行排序和分组,使其成为:@[@"bookmark2"、@"bookmark3"、@"bookmark1"]?
谢谢!
您可以去掉第二个数组,改用字典,它以 UUID 为键。
NSArray *sortedIDs = @[ @"uuid1", @"uuid3", @"uuid2", ];
NSDictionary *items = @{
@"uuid1" : @[ bookmark1 ],
@"uuid2" : @[ bookmark2 ],
@"uuid3" : @[ bookmark3 ],
};
现在当您想要第二个书签时,您可以使用
访问它NSArray *bookmarksForUUID = items[sortedIDs[1]];
如果您想构建上面的结构,您可以将如下的类别添加到 NSArray
- (NSDictionary *)pas_groupBy:(id (^)(id object))block;
{
NSParameterAssert(block);
NSMutableDictionary *groupedDictionary = NSMutableDictionary.new;
for (id object in self) {
id key = block(object);
if (groupedDictionary[key]) {
[groupedDictionary[key] addObject:object];
} else {
groupedDictionary[key] = [NSMutableArray arrayWithObject:object];
}
}
return groupedDictionary;
}
然后假设您的书签对象类似于
@interface Bookmark : NSObject
@property (nonatomic, copy) NSString *UUID;
// other properties
// other properties
@end
您可以像这样使用类别
NSDictionary *bookmarksMappedBySection = ({
return [bookmarks pas_groupBy:^(Bookmark *bookmark) {
return bookmark.UUID;
};
});
创建一个classBookmark
。将 UUID 和标题作为属性添加到此 class。现在你可以只有一个数组,其中包含 objects of class Bookmark
并且每个数组都可以访问它的 UUID 和标题(以及你以后可能想要添加的任何其他属性) ).
@interface Bookmark: NSObject
@property (nonatomic,strong) NSString *uuid;
@property (nonatomic,strong) NSString *title;
@end
现在,如果您有 NSArray
(我们称之为 myBookmarks
),您可以执行以下操作:
for (Bookmark *bookmark in myBookmarks) {
NSLog(@"my UUID is %@",bookmark.uuid);
NSLog(@"my title is %@",bookmark.title);
}
如果您需要将这些项目存储在NSUserDefaults
中,您所要做的就是采用NSCoding
协议。如果您不知道该怎么做,here 是一个很好的简单示例。