【问题标题】:Compare two arrays with the same value but with a different order比较两个具有相同值但顺序不同的数组
【发布时间】:2013-03-29 18:45:37
【问题描述】:

我有 2 个 nsarray,具有相同的值但顺序不同。

NSArray * array1 = {0,1,2,3}
NSArray * array2 = {2,3,1,0}

我需要一种方法来确定两个数组是否以不同的顺序具有相同的值。

种类

-(BOOL) isSameValues:(NSArray*)array1 and:(NSArray*)array2;

【问题讨论】:

  • 对 em 排序,然后迭代,看看是否每个元素都匹配。

标签: objective-c nsarray


【解决方案1】:

您可以为此目的使用NSCountedSet

- (BOOL)isSameValues:(NSArray*)array1 and:(NSArray*)array2
{
    NSCountedSet *set1 = [NSCountedSet setWithArray:array1];
    NSCountedSet *set2 = [NSCountedSet setWithArray:array2];
    return [set1 isEqualToSet:set2];
}

NSCountedSet 是不同对象的集合,其中每个对象都有一个与之关联的计数器。因此结果为

NSArray *array1 = @[@0,@1,@2,@3];
NSArray *array2 = @[@2,@3,@1,@0];

YES,但是对于

NSArray *array1 = @[@1,@1,@3,@3];
NSArray *array2 = @[@3,@3,@3,@1];

结果是NO

【讨论】:

  • 我想知道只是对数组进行排序然后比较是否会是相同的速度,或者可能更快?
  • @DmitryShevchenko:我假设将数组元素插入计数集中(使用hash 方法来识别相同元素)比实际排序所有元素(或至少不慢)。但我不能肯定地告诉你。 - 在任何情况下,这都适用于任意元素的数组,这可能无法比较。
  • 我已经听过很多关于数组 VS 速度的故事了。 NSSet。我不知道该相信哪个,但就比较而言,这是非常正确的。今天学到了一些东西。 +1。
【解决方案2】:

更新:如果数组有重复元素,这将不起作用!

您可以使用这些数组创建两个 NSSets 并进行比较。

NSArray * array1 = @[@0,@1,@2,@3];
NSArray * array2 = @[@2,@3,@1,@0];

NSSet *set1 = [NSSet setWithArray:array1];
NSSet *set2 = [NSSet setWithArray:array2];

NSLog(@"result %@", [set1 isEqualToSet:set2] ? @"YES" : @"NO");

【讨论】:

  • 这会将[@1, @2, @2][@1, @1, @2] 视为相等。
  • @MartinR:尚不清楚这是不正确的行为。它确实包含相同的值。如果出现次数相关,只需将其设为 NSCountedSet。
【解决方案3】:
if ([[NSSet setWithArray:array1] isEqualToSet:[NSSet setWithArray:array2]]) {
    // the objects are the same
}

【讨论】:

  • 这会将[@1, @2, @2][@1, @1, @2] 视为相等。
【解决方案4】:

总共没有元素。有一个柜台。并放置双'for循环'来解析彼此的每一个元素。在每次匹配时增加计数器。 注意:这在所有元素都是唯一的情况下有效。

如果不同或您不知道,请将它们排序并一对一匹配。

【讨论】:

    【解决方案5】:

    另一种方法是使用NSHashTable

    - (BOOL)array:(NSArray *)array1 containsTheSameObjectsAsArray:(NSArray *)array2 {
        if (array1.count != array2.count) {
            return NO;
        }
        NSHashTable *table = [[NSHashTable alloc] initWithOptions:NSHashTableWeakMemory 
                                                         capacity:array1.count];
        for (NSObject *object in array1) {
            [table addObject:object];
        }
        for (NSObject *object in array2) {
            if (![table containsObject:object]) {
                return NO;
            }
        }
       return YES;
    }
    

    注意NSHashTable 需要 iOS 6+

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 2016-03-11
      相关资源
      最近更新 更多