Создайте структуру данных таким образом, чтобы элементы стали ключом. В вашем примере структура данных может быть построена так, как показано ниже
"one": {A}
"two": {A,B}
"three": {A,B}
"four": {B,C}
"five": {C}
Теперь все, что вам нужно проверить, это взять каждый элемент в вашем входном наборе D и добавить счетчик для каждого из имен набора. , так что в вашем примере, D будет {"четыре", "пять", "шесть"}
Теперь вы можете просматривать циклы "четыре", "пять" и "шесть"
Step 1: The counter will be all zeros initially
Step 2: After looking at the values for "four" the counter will look like below
B:1, C:1
Step 3: After looking at the values for "five" the counter will look like below
B:1, C:2
Step 4: After looking at the values for "six" the counter will look like below
B:1, C:2
Step 5: Choose the set with the maximum value. In this case it will be C.
[ 117] Если вы используете python, вы можете использовать метод collection.Counter most_common.
https://docs.python.org/3/library/collections.html#collections.Counter
Это должно работать:
@interface MyClass
{
int _doubleDigits[10];
}
@property(readonly) int *doubleDigits;
@end
@implementation MyClass
- (int *)doubleDigits
{
return _doubleDigits;
}
@end
Я просто размышляю:
я думаю, что переменная, определенная в ivars, выделяет место прямо в объекте. Это препятствует тому, чтобы Вы создали средства доступа, потому что Вы не можете дать массив значением к функции, но только через указатель. Поэтому необходимо использовать указатель в ivars:
int *doubleDigits;
И затем выделяют место для него в init-методе:
@synthesize doubleDigits;
- (id)init {
if (self = [super init]) {
doubleDigits = malloc(sizeof(int) * 10);
/*
* This works, but is dangerous (forbidden) because bufferDoubleDigits
* gets deleted at the end of -(id)init because it's on the stack:
* int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
* [self setDoubleDigits:bufferDoubleDigits];
*
* If you want to be on the safe side use memcpy() (needs #include <string.h>)
* doubleDigits = malloc(sizeof(int) * 10);
* int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
* memcpy(doubleDigits, bufferDoubleDigits, sizeof(int) * 10);
*/
}
return self;
}
- (void)dealloc {
free(doubleDigits);
[super dealloc];
}
В этом случае интерфейс похож на это:
@interface MyClass : NSObject {
int *doubleDigits;
}
@property int *doubleDigits;
Редактирование:
я действительно не уверен, позволяется ли сделать это, те значения действительно на стеке, или они хранятся где-то в другом месте? Они, вероятно, хранятся на стеке и поэтому не безопасные использовать в этом контексте. (См. вопрос в списках инициализатора )
int bufferDoubleDigits[] = {1,2,3,4,5,6,7,8,9,10};
[self setDoubleDigits:bufferDoubleDigits];
Это работает
@interface RGBComponents : NSObject {
float components[8];
}
@property(readonly) float * components;
- (float *) components {
return components;
}
Массивы C не являются одним из поддерживаемых типов данных для свойств. См. раздел "Язык программирования Ц" в документации по Xcode, на странице Объявленные свойства:
Поддерживаемые типы
Вы можете объявить свойство для любых Класс "Цель-С", базовый фонд тип данных, или "простые старые данные" (POD). (см. C++ Язык Примечание: POD Типы). Для ограничений по использованию Core Типы фондов, однако, см. Фонд."
POD не включает массивы C. См. . http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html
Если вам нужен массив, используйте NSArray или NSData.
Обходные пути, как я их вижу, похожи на использование (void *) для обхода проверки типа. Вы можете это сделать, но это делает ваш код менее поддерживаемым.