【问题标题】:Check for duplicate NSStrings on a NSMutableArray检查 NSMutableArray 上的重复 NSStrings
【发布时间】:2011-05-06 05:03:41
【问题描述】:

我有一个 NSMutableArray,我想在其中添加字符串。在将字符串添加到数组之前,我需要检查该字符串是否已存在于数组中。无论如何知道一个好方法吗?

谢谢!

【问题讨论】:

    标签: objective-c cocoa nsstring nsarray duplicates


    【解决方案1】:

    如果顺序无关紧要,最简单的方法是切换到使用 NSMutableSet。集合是无序的,NSSet 和 NSMutableSet 只能包含每个对象一次。只有一个计数集(NSCountedSet)可以多次包含同一个对象。

    如果顺序确实重要,请继续使用 NSMutableArray,并在添加之前使用-containsObject: 检查对象是否已存在。


    编辑:从 Lion 开始,我们现在拥有 NSOrderedSet 和 NSMutableOrderedSet!我的花生酱里有巧克力!我的巧克力里有花生酱!

    就像无序集合一样,您可以获得快速的成员资格测试、禁止重复,当然还有集合操作(​​联合、交集等)。像数组一样,您可以获得有序访问,包括可靠顺序枚举和按索引访问。

    因此,如果您需要拒绝重复但同时保持顺序,Lion 的 NS{,Mutable}OrderedSet 类适合您。

    【讨论】:

      【解决方案2】:

      如果你只想做你曾经说过的事情,只需使用containsObject:,如

      if (![myArray containsObject:theObject]) [myArray addObject:theObject];
      

      请注意,这会在数组中进行线性搜索,因此如果您要经常使用此操作,则不合适。如果是,并且不需要订购,则应使用NSSet。如果您确实需要订购,您可以同时使用保持同步的 NSArrayNSSet(例如,始终同时从两个集合中添加/删除相同的对象)。

      【讨论】:

      • 不包含对象检查引用指针?如果您有一个外部字符串并想比较该值,我不知道这是否会按预期工作。
      • jocull:文档说成员资格测试是通过比较对象的 hash 值然后询问它们是否相等 (isEqual:) 来执行的。 developer.apple.com/mac/library/documentation/Cocoa/Reference/…
      • 如果它不起作用,那么对象不认为它等于数组中的任何东西。所以要么你的对象真的不等于数组中的某个东西,要么它有一个错误的 -hash-isEqual: 方法。
      • -containsObject: 绝对不检查引用指针;那是-indexOfObjectIdenticalTo: 的工作
      • @jocull:您正在查看 NSSet 的文档。我同意,这是非常模糊的。 -[NSArray conainsObject:] 的文档更加具体,并明确指出它依赖于 -hash-isEqual:。如果您使用的是 NSSet,则可以使用 -member: 而不是 -containsObject: 如果您想确定它正在执行相等性测试。
      【解决方案3】:

      我更喜欢 here 中描述的 NSPredicate

      总之

      NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"Ben", @"Adam", @"Melissa", nil];
      
      NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES[c] %@", your_search_key];
      NSArray *beginWithB = [array filteredArrayUsingPredicate:bPredicate];
      
      if ([beginWithB count] > 0)
      {
          //Handle duplicate
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多