如何根据不同 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 是一个很好的简单示例。