【问题标题】:Check duplicate property values of objects in NSArray检查 NSArray 中对象的重复属性值
【发布时间】:2013-05-09 11:13:02
【问题描述】:

我有一个 NSArray 包含具有 size 属性的对象。

如何检查NSArray 是否有两个对象具有相同的size 值?

我可以这样做吗:

int i = 0;
for (id item1 in myArray) {
    NSDecimalNumber *size1 = [item1 size];

    for (id item2 in myArray) {
        NSDecimalNumber *size2 = [item2 size];

        if ([size1 isEqual:size2]) {
            i ++;
        }
    }
}

if (i > [myArray count]) {
    NSLog(@"Duplicate Sizes Exist");
}

或者有没有更简单的方法?

【问题讨论】:

  • 您可以执行上述操作,但它是“N 平方”,通常被认为不适用于较大的集合。

标签: objective-c cocoa-touch cocoa search nsarray


【解决方案1】:

试试这个代码:

NSSet *myset = [NSSet setWithArray:[myarray valueForKey:@"size"]];
int duplicatesCount = [myarray count] - [myset count];

size 这里是对象属性。

【讨论】:

【解决方案2】:

使用NSCountedSet。然后将所有对象添加到计数集中,并使用 countForObject: 方法找出每个对象在数组中出现的频率。

您也可以查看此链接how-to-find-duplicate-values-in-arrays

希望对你有帮助

【讨论】:

  • 是的,但对象可能不同但大小相同。所以数组我有 2 个大小为 3 的对象,但一个是棕色的,一个是灰色的。您的建议只会选择相同的对象。
【解决方案3】:

可能最简单的方法是根据大小字段对数组进行排序,然后逐步通过排序列表查找相邻的重复项。

您还可以将每个对象“包装”在一个对象中,将大小作为其键导出并使用一个集合。但这是很多额外的分配。

但是,如果您只想知道是否存在欺骗,而不想知道它们是哪些,请为每个对象的大小创建一个 NSNumber 并将 NSNumber 插入一个集合中。最终大小会告诉你有多少重复。

【讨论】:

  • 这是一个很好的建议,因为数组已经排序。谢谢热舔:)
【解决方案4】:
NSArray *cleanedArray = [[NSSet setWithArray:yourArraywithDuplicatesObjects ] allObjects];

使用 Sets 这将删除所有重复的对象。将返回 NSArrayNSCountedSet 并使用 countForObject: 方法找出每个对象出现的频率。

【讨论】:

  • 我知道使用 NSSet 会有很多建议,但我没有重复的对象,只需要检查是否有任何对象具有相同的属性值:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 2018-01-01
  • 2019-03-15
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
相关资源
最近更新 更多