计算对象在NSArray中出现的次数

时间:2016-08-20 03:46:52

标签: ios objective-c

我有一个5个骰子的NSArray(dice1,dice2,dice3 ......)。一旦我运行了随机数生成器,每个dice1,dice2,dice3 ......都可以返回1-6之间的值。

我希望能够计算返回值1-6的次数。 我不太确定最好的方法,我是否应该将int数字1-6转换为匹配的字符串。

2 个答案:

答案 0 :(得分:0)

由于基础类型(例如NSCountedSet)无法存储内在类型(例如int),我认为没有特别优雅的解决方案)。在这种情况下,Swift自动装箱/取消装箱进入NSNumber是一个不错的功能。

由于您处理少量骰子和少量可能的值,因此您可以忽略对象,集合以及所有这些并且只是遍历您的骰子数组,更新整数计数数组。

另一种更复杂但面向对象的方法是创建一个Die类:

<强> Die.h

#import <Foundation/Foundation.h>

@interface Die : NSObject

-(instancetype)initWithSides:(NSUInteger)sides;
-(instancetype)initWithSides:(NSUInteger)sides initialValue:(NSUInteger)value;
-(NSUInteger)value;
-(NSUInteger)roll;
-(NSUInteger)sides;

@end

<强> Die.m

#import "Die.h"

@interface Die ()

@property NSUInteger currentValue;
@property NSUInteger numberOfsides;

@end


@implementation Die


- (instancetype)initWithSides:(NSUInteger)sides {
    NSAssert(sides>1, @"Dice must have at least 2 sides");

    if (self = [super init]) {
        self.numberOfsides = sides;
        [self roll];
    }

    return self;
}

- (instancetype)initWithSides:(NSUInteger)sides initialValue:(NSUInteger)value {
    NSAssert(sides>1, @"Dice must have at least 2 sides");
    NSAssert(value <= sides, @"Initial value must not exceed number of sides");

    if (self = [super init]) {
        self.numberOfsides = sides;
        self.currentValue = value;
    }

    return self;
}
- (NSUInteger)roll {
    self.currentValue = arc4random_uniform((UInt32)self.numberOfsides)+1;
    return self.currentValue;
}

- (NSUInteger)value {
    return self.currentValue;
}

- (NSUInteger)sides {
    return self.numberOfsides;
}

- (NSUInteger)hash {
    return self.currentValue;
}

- (BOOL)isEqual:(id)object {
    if (self == object) {
        return YES;
    }

    if (![object isKindOfClass:[Die class]]) {
        return NO;
    }

    return [self isEqualToDie:(Die *)object];
}

- (BOOL) isEqualToDie:(Die *)otherDie {
    return self.currentValue == otherDie.value;
}


@end

所以现在你有一个可以存储在NSCountedSet中的对象,你可以检索计数。由于您需要将Die与适当的值进行比较,而不仅仅是值本身,因此这一点有点尴尬:

// self.dice is an array of `Die` objects
NSCountedSet *valueCounts = [NSCountedSet setWithArray:self.dice];

for (int i=1;i<7;i++) {
    NSUInteger count = [valueCounts countForObject:[[Die alloc] initWithSides:6 initialValue:i]];
    NSLog(@"There are %lu dice showing %d",count,i);
}

答案 1 :(得分:-2)

使用词典:

let arrNum = [“one”, “two”, “three”, “two”]
var countNumber:[String:Int] = [:]

for item in arrNum {
    countNumber[item] = (countNumber[item] ?? 0) + 1
}

for (key, value) in countNumber {
    print("\(key) occurs \(value) time")
}

o / p:

one occurs 1 time
     two occurs 2 time
     three occurs 1 time