【问题标题】:How can I check if a value in a smaller array is in a larger array?如何检查较小数组中的值是否在较大数组中?
【发布时间】:2011-08-16 22:36:26
【问题描述】:

我有两个数组:

符号 - 较小的数组 fetchedSymbolsArray - 更大的数组

如何检查符号中的内容是否也在 fetchedSymbolsArray 中?

假设

symbols = ["AAPL", "GOOG", "YHOO"];
fetchedSymbolsArray = ["AAPL", "GOOG", "YHOO", "MSFT"];

我想检查是否有重复项,然后将 fetchedSymbolsArray 中的任何其他元素添加回符号中。在这种情况下,将添加 MSFT。

【问题讨论】:

  • 问题出在哪里?效率?
  • 您需要更具体。是否要检查较小数组中的所有项目是否都在较大数组中?顺序重要吗?你试过什么?
  • ISTM 您希望与主题标题所暗示的相反:您想检查较大数组中的哪些值不在较小数组中,如果找到,请将其添加到较小数组中。为什么不简单地将较大的数组复制到较小的数组中呢?为什么不做两个集合而不是数组?
  • 我需要能够维护两个不同的集合。此外,较小的数组可能包含较大数组没有的元素。我需要能够合并这些。你能给我举个例子吗?很难做到这一点。
  • 如果你有两个 sets 项,那么使用 NSSet 或 NSMutableSet 而不是 NSArray 或 NSMutableArray。它们将防止重复,并有办法找到联合、节、差异等。当然你也可以使用数组,但是你必须自己做所有这些。此处的答案显示了如何做到这一点。

标签: objective-c arrays algorithm search


【解决方案1】:

试试这个。

BOOL contentIsInLargerArray = NO;
for (id *object in symbols) {
    if ([fetchedSymbolsArray containsObject:object])
        contentIsInLargerArray = YES;
}
return contentIsInLargerArray;

这使用 -(BOOL)containsObject:(id)anObject 而不是 -[indexObObject:]。

【讨论】:

    【解决方案2】:

    你可以使用NSArray方法

    - (NSUInteger)indexOfObject:(id)anObject
    

    测试一个数组是否有某个对象。如果不是,则返回结果为NSNotFound。这是检查一个数组是否是另一个数组的子集的简单方法:

    NSUInteger index;
    for (int i=0; i<[symbols count]; ++i) {
        index = [fetchedSymbolsArray indexOfObject:[symbols objectAtIndex:i]];
        if (index == NSNotFound) {
            return NO;
        }
    }
    return YES;
    

    当然,这可以使用快速枚举或其他技巧来改善,具体取决于数组中的对象,它们是否已排序等。

    【讨论】:

      【解决方案3】:
      for (int i = 0; i<[symbols count]; i++) {
          id myObj = [symbols objectAtIndex:i]; // I set id because type is unknown
          if ([fetchedSymbolsArray indexOfObject:myObj] != NSNotFound) {
              NSLog(@"Object %@ found in fetched symbols", myObj);
          }
      } 
      

      【讨论】:

      • 这只检查符号数。如果 fetchedSymbolsArray 更大,可能会有一些额外的元素没有被比较。
      • 然后反过来做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2014-02-18
      • 2016-06-19
      • 1970-01-01
      相关资源
      最近更新 更多