target-c nsmutablearray setValue для ключевой проблемы - PullRequest
1 голос
/ 30 августа 2011

Мои коды:

NSArray *array = //objects here
NSMutableArray *mutarray = [[NSMutableArray alloc] init];

    for (NSString *s in array)
    {
        NSRange ran = [s rangeOfString:@"abc"];
    if (ran.location != NSNotFound)
    {
        int inde = [array indexOfObject:s];
        [mutarray setValue:[NSNumber numberWithInt:inde] forKey:s];
    } 
    }
    NSLog (@"mutarray: %@", mutarray);  

Я пробовал NSMutableDictionary, но содержимое не упорядочено, поэтому я предпочитаю NSMutableArray для упорядоченного хранения значений и ключей.Но вывод NSLog ничего не показал, что за черт?Вывод NSMutableDictionary показал четыре открытия.


EDIT:

Я даже пробовал этот код перед NSLog, но ничего не показывает:

[mutarray setValue:@"aha" forKey:@"jaha"];

РЕДАКТИРОВАТЬ: Ребята, спасибо за ответ!Теперь я понимаю.Но проблема в том, что я храню числа как значения, а строки - как ключи.У меня есть NSMutableDictionary, который неупорядочен.Я до сих пор не понял, как мне его заказать.У меня есть коды, которые я использую, но они неправильно написаны:

NSInteger intSort(id num1, id num2, void *context)
{
    int v1 = [num1 intValue];
    int v2 = [num2 intValue];
    if (v1 < v2)
        return NSOrderedAscending;
    else if (v1 > v2)
        return NSOrderedDescending;
    else
        return NSOrderedSame;
}   

В другом методе:

NSArray *ordered = [[mutdic allValues] sortedArrayUsingFunction:intSort context:NULL];
NSLog (@" ordered: %@", ordered);

Вывод показывает только:

2011-08-29 22:36:03.998 scanner2[32359:207]  ordered: (
    1,
    5,
    9,
    16
)

Вывод должен показывать это в порядке:

2011-08-29 22:36:03.992 scanner2[32359:207] mutdic:  5 jam (geologi) en
2011-08-29 22:36:03.993 scanner2[32359:207] mutdic:  9 jax. (geologi)jammen
2011-08-29 22:36:03.994 scanner2[32359:207] mutdic:  1 beta (geologi).
2011-08-29 22:36:03.995 scanner2[32359:207] mutdic: 16 .(geologi),be;ta;

Ответы [ 4 ]

6 голосов
/ 30 августа 2011

NSMutableArray не хранит пары ключ / значение, он только хранит объекты.Чтобы добавить объект в массив, используйте метод -addObject:.

Используйте array для хранения упорядоченного списка объектов.Используйте словарь , когда вам нужно найти объект по заданному ключу.Если вы хотите упорядоченный список ключей словаря, используйте

NSArray* orderedKeys = 
    [[myDictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];

Редактировать : несколько дополнительных опций.

  1. Просто сохранитемассив индексов, затем найдите значение в вашем основном array строках.

    for (NSUInteger i = 0; i < [array count]; ++i)
    {
        NSString* s = [array objectAtIndex:i];
        NSRange ran = [s rangeOfString:@"abc"];
        if (ran.location != NSNotFound)
        {
            [mutarray addObject:[NSNumber numberWithInt:i]];
        } 
    }
    
    for (NSNumber* index in mutarray)
    {
        NSLog(@"Found %@:%@", index, [array objectAtIndex:[index intValue]]);
    }         
    
  2. Сохраните двумерный массив индексов и строк:

    for (NSUInteger i = 0; i < [array count]; ++i)
    
    {
        NSString* s = [array objectAtIndex:i];
        NSRange ran = [s rangeOfString:@"abc"];
        if (ran.location != NSNotFound)
        {
            [mutarray addObject:
                [NSArray arrayWithObjects:[NSNumber numberWithInt:i],
                                          s,
                                          nil]]; 
        } 
    }
    
3 голосов
/ 30 августа 2011

NSArray - упорядоченная коллекция объектов.Это не отображение ключ-значение объектов.Вызов setValue:forKey: на NSArray - это то же самое, что отправка setValue:forKey: каждому из его пунктов.

1 голос
/ 30 августа 2011

Похоже, вы хотите сохранить упорядоченный список пар. Так что NSArray of NSArrays

for (NSString *s in array)
{
    NSRange ran = [s rangeOfString:@"abc"];
    if (ran.location != NSNotFound)
    {
        int inde = [array indexOfObject:s];
        NSArray* pair = [NSArray arrayWithObjects:[NSNumber numberWithInt:inde],s,nil];
        [mutarray addObject: pair];
    } 
}
1 голос
/ 30 августа 2011

Этот setValue: ForKey: метод не из NSMutableArray, это NSKeyValueCodingProtocol

В вашем случае, так как вы хотите упорядоченные результаты из словаря, вы можете взглянуть наследующие методы:

- keysSortedByValueUsingSelector: - keysSortedByValueUsingComparator: - keysSortedByValueWithOptions: usingComparator:

Если вам нужны отсортированные значения, просто используйте allKeys, который возвращает массив.Вы можете отсортировать массив, используя любой из следующих методов:

- sortedArrayHint - sortedArrayUsingFunction: context: - sortedArrayUsingFunction: context: hint: - sortedArrayUsingDescriptors: - sortedArrayUsingSelector: - sortedArrayUsingComparator: - sortedArthis, используя:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...