Objective c 给定4个对象,如何确定2是否具有特定属性

Objective c 给定4个对象,如何确定2是否具有特定属性,objective-c,algorithm,Objective C,Algorithm,我还有另一个问题,关于如何最优雅地解决这个问题,因为我不能马上上计算机学校,所以我实际的“纯编程”CS知识并不完美或伟大。这基本上是一个算法问题(如果我用错了,请有人纠正我,因为我不想一直说下去,让自己难堪) 我有4个物体。它们每个都有一个物种属性,可以是狗、猫、猪或猴子。因此,示例情况可能是: 对象1.种类=猪 对象2.物种=猫 对象3.种类=猪 对象4.物种=狗 现在,如果我想知道这4个物种是否都是同一物种,我知道我可以说: if ( (object1.species==object2.s

我还有另一个问题,关于如何最优雅地解决这个问题,因为我不能马上上计算机学校,所以我实际的“纯编程”CS知识并不完美或伟大。这基本上是一个算法问题(如果我用错了,请有人纠正我,因为我不想一直说下去,让自己难堪)

我有4个物体。它们每个都有一个物种属性,可以是狗、猫、猪或猴子。因此,示例情况可能是:

对象1.种类=猪 对象2.物种=猫 对象3.种类=猪 对象4.物种=狗

现在,如果我想知道这4个物种是否都是同一物种,我知道我可以说:

if  ( (object1.species==object2.species) 
    && (object2.species==object3.species)
    && (object3.species==object4.species)
) {
    // They are all the same animal (don't care WHICH animal they are)
}
但这并不优雅,对吧?如果我突然想知道它们中是否有3或2个是同一物种(尽管不在乎是哪一个物种),我突然陷入了意大利面代码

我使用的是Objective C,虽然我不知道这是否真的重要,因为最优雅的解决方案是我假设所有语言在概念上都是相同的?有人有好主意吗

谢谢

您可以使用哈希表(或objective-C中的字典)和物种的键,每次递增计数

为清楚起见(伪代码):

现在,您可以查看物种的数量:

for each key in hashtable
    if ( hashtable[ key ] == 3 ) // species "key" has 3 items
        /* Code */

当然,如果种类只是一个简单的枚举/整数,“哈希表”可以只是一个简单的数组。上述两种情况下的理论应该是相同的。

您可以计算所有可能的比较中有多少比较匹配。如果恰好有1个比较为真,则正好有2个项目相同;如果有3个比较匹配,则正好有3个项目相同。这个例子是C语言的,你必须自己把它转换成objective-C

int count = 0;
count += object1.species == object2.species;
count += object1.species == object3.species;
count += object1.species == object4.species;
count += object2.species == object2.species;
count += object2.species == object3.species;
count += object3.species == object4.species;
// count 0 - all different
// count 1 - exactly 2 are the same
// count 2 - two pairs of 2
// count 3 - exactly 3 are the same
// count 6 - all are the same
计数也可以实现为一个循环:

for (int i = 0; i < 4; i++)
    for (int j = i + 1; j < 4; j++)
        count += objects[i].species == objects[j].species;
for(int i=0;i<4;i++)
对于(int j=i+1;j<4;j++)
计数+=对象[i]。物种==对象[j]。物种;

仅当对象数量为5或更少时,此方法才有效。由于这一点以及比较量是按二次方进行缩放的事实,如果对象量较大,最好使用哈希表。

这正是集合和计数集合的用途

BOOL allSameSpecies(NSArray *animals) {
    NSSet *speciesSet = [NSSet setWithArray:[animals valueForKey:@"species"]];
    return [[speciesSet] count] == 1;
}

BOOL sameSpeciesNumber(NSArray *animals, NSUInteger targetCount) {
    NSCountedSet *speciesCounts = [NSCountedSet setWithArray:[animals valueForKey:@"species"]];
    for (id species in speciesCounts) {
        if ([speciesCounts countForObject:species] == targetCount)
            return YES;
    }
    return NO.
}

+1,对于像这样的一个小例子,即使是一个常规的C数组也足够了。我同意,尽管您必须创建一个映射表(除非物种是一个简单的枚举/int),它可能已经超过了一半。好的,是的,所以实际上如果我使用4个int值而不是动物名称,那么object1.species=1;然后我可以使用一个C数组并执行如下操作:int speciesArray[4]={object1.species,object2.species,object3.species,object4.species};然后只需使用一些命令,比如[int0包含多少speciesArray元素];正确的?所以我只需要找出什么是计算speciesArray数组中有多少个0的正确函数?我添加了一些伪代码以使其更清晰。如果你有任何问题,请告诉我。谢谢你,这很有意义,我明白了!谢谢你的帮助,我的朋友!
for (int i = 0; i < 4; i++)
    for (int j = i + 1; j < 4; j++)
        count += objects[i].species == objects[j].species;
BOOL allSameSpecies(NSArray *animals) {
    NSSet *speciesSet = [NSSet setWithArray:[animals valueForKey:@"species"]];
    return [[speciesSet] count] == 1;
}

BOOL sameSpeciesNumber(NSArray *animals, NSUInteger targetCount) {
    NSCountedSet *speciesCounts = [NSCountedSet setWithArray:[animals valueForKey:@"species"]];
    for (id species in speciesCounts) {
        if ([speciesCounts countForObject:species] == targetCount)
            return YES;
    }
    return NO.
}