Что лучший способ состоит в том, чтобы переставить NSMutableArray?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
187
задан Kristopher Johnson 6 June 2017 в 03:48
поделиться

3 ответа

Вам не нужен swapObjectAtIndex метод. exchangeObjectAtIndex:withObjectAtIndex: уже существует.

74
ответ дан HRM 23 November 2019 в 05:44
поделиться

Я решил это путем добавления категории к NSMutableArray.

Редактирование: Удаленный ненужный метод благодаря ответу Ladd.

Редактирование: Измененный (arc4random() % nElements) к arc4random_uniform(nElements) благодаря ответу Gregory Goltsov и комментариям miho и Редактирования blahdiblah

: улучшение Цикла, благодаря комментарию Редактирования Ron

: Добавленная проверка, что массив не пуст благодаря комментарию Mahesh Agrawal

//  NSMutableArray_Shuffling.h

#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#else
#include <Cocoa/Cocoa.h>
#endif

// This category enhances NSMutableArray by providing
// methods to randomly shuffle the elements.
@interface NSMutableArray (Shuffling)
- (void)shuffle;
@end


//  NSMutableArray_Shuffling.m

#import "NSMutableArray_Shuffling.h"

@implementation NSMutableArray (Shuffling)

- (void)shuffle
{
    NSUInteger count = [self count];
    if (count <= 1) return;
    for (NSUInteger i = 0; i < count - 1; ++i) {
        NSInteger remainingCount = count - i;
        NSInteger exchangeIndex = i + arc4random_uniform((u_int32_t )remainingCount);
        [self exchangeObjectAtIndex:i withObjectAtIndex:exchangeIndex];
    }
}

@end
348
ответ дан Kristopher Johnson 23 November 2019 в 05:44
поделиться

Это самый простой и быстрый способ перемешать NSArrays или NSMutableArrays (объект puzzles - это NSMutableArray, он содержит объекты головоломки. Я добавил в индекс переменной объекта головоломки, который указывает начальную позицию в массиве)

int randomSort(id obj1, id obj2, void *context ) {
        // returns random number -1 0 1
    return (random()%3 - 1);    
}

- (void)shuffle {
        // call custom sort function
    [puzzles sortUsingFunction:randomSort context:nil];

    // show in log how is our array sorted
        int i = 0;
    for (Puzzle * puzzle in puzzles) {
        NSLog(@" #%d has index %d", i, puzzle.index);
        i++;
    }
}

вывод журнала:

 #0 has index #6
 #1 has index #3
 #2 has index #9
 #3 has index #15
 #4 has index #8
 #5 has index #0
 #6 has index #1
 #7 has index #4
 #8 has index #7
 #9 has index #12
 #10 has index #14
 #11 has index #16
 #12 has index #17
 #13 has index #10
 #14 has index #11
 #15 has index #13
 #16 has index #5
 #17 has index #2

вы также можете сравнить obj1 с obj2 и решить, что вы хотите вернуть возможные значения:

  • NSOrderedAscending = -1
  • NSOrderedSame = 0
  • NSOrderedDescending = 1
6
ответ дан 23 November 2019 в 05:44
поделиться