【问题标题】:NSArray - How to filter an array based on two properties being matched to another object in the same array?NSArray - 如何根据与同一数组中的另一个对象匹配的两个属性来过滤数组?
【发布时间】:2015-03-02 21:57:20
【问题描述】:

我有一个这个对象的数组:

NSString *pageNumber;
NSInteger index;
NSString *textValue;
NSString *bookmark;
NSString *GUID;

我想删除具有相同 textValueindex 值的重复对象。它不应查看其他属性,而应仅查看这两个属性。

编辑:另外,为了在会话期间保持值相同,我只想为 2 个相同条目选择排序中较低的 GUID。

我以前使用过distinctUnionOfObjects,但它只能在我需要按一个属性过滤重复项时帮助我。

我想到的另一种创造性方法是在数组中创建另一个属性,它是这两个属性的组合,然后对它们执行distinctUnionOfObjects,但它看起来很脏而且很糟糕。

实现此目的最简单、最有效的方法是什么?

【问题讨论】:

  • 你看过NSPredicate吗? NSArray 有一个方法可以让你使用谓词,它们应该让你做你想做的事。

标签: ios objective-c cocoa-touch nsmutablearray nsarray


【解决方案1】:

如果您在对象上实现isEqual:hash,它将自动不允许NSSet 中的重复对象。您可以使用NSOrderedSet 来保持对象的顺序。

@implementation YourClass
- (BOOL)isEqual:(id)other {
  if (!([self class] == [other class]))
    return NO;
  YourClass *element = other;
  if (self.index != element.index) return NO;
  if (![self.textValue isEqualToString:element.textValue]) return NO;
  return YES;
}

- (NSUInteger)hash {
  NSUInteger prime = 31;
  NSUInteger hash = [[self class] hash];
  hash = hash * prime + self.index;
  hash = hash * prime + (NSUInteger)([self.textValue hash] ^ ([self.textValue hash] >> 32));
  return hash;
}
@end

uniqueObjects = [NSOrderedSet orderedSetWithArray:allObjects];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多