我有一个5个骰子的NSArray(dice1,dice2,dice3 ......)。一旦我运行了随机数生成器,每个dice1,dice2,dice3 ......都可以返回1-6之间的值。
我希望能够计算返回值1-6的次数。 我不太确定最好的方法,我是否应该将int数字1-6转换为匹配的字符串。
答案 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