2014-09-17 3 views
0

У меня есть NSArray с 4 объектами, скажем, 1, 2, 3 и 4. Я хочу отсортировать этот массив в порядке возрастания, но со случайным образом выбранным стартовым номером. Например; 2, 3, 4 и 1 или 4, 1, 2 и 3.Сортировка NSArray в порядке убывания

Как это сделать?

То, что я до сих пор:

NSArray *playersArray = [_players allKeys]; 
NSSortDescriptor *sortPlayerArray = [[NSSortDescriptor alloc] initWithKey:nil ascending:YES]; 
playersArray = [playersArray sortedArrayUsingDescriptors:@[sortPlayerArray]]; 

Это приводит к 1, 2, 3, 4, очевидно. Я также возможность произвольно заказывать игроков, так как:

activePlayersArray = [_players allKeys]; 
NSMutableArray *temp = [[NSMutableArray alloc] initWithArray:activePlayersArray]; 

int count = (int)[temp count]; 

for (int i = 0; i < count; ++i) { 
    int nElements = count - i; 
    int n = (arc4random() % nElements) + i; 
    [temp exchangeObjectAtIndex:i withObjectAtIndex:n]; 
} 

activePlayersArray = [NSArray arrayWithArray:temp]; 

Так как я могу «объединить» эти два, чтобы получить результаты, которые я хочу?

Надеюсь, вы, ребята, можете мне помочь.

Спасибо!

+0

Это опечатка в названии? Это противоречит вопросу. – rmaddy

+0

Сортируйте сначала, затем получите случайный индекс и переместите этот элемент в начало массива. – CrimsonChris

ответ

1

Я думаю, что это то, что @Konsol намеревается с парами исправлений: (1) похоже, что OP хочет, чтобы порядок возрастал, и (2) массив, разделенный на другой ответ, находится в средней точке. Но я думаю, что дух правильный ...

// Start with an unsorted (immutable?) input array of numbers (or any object 
// that implements compare:. 
// Pick a random location and produce an output array as described by the OP 

NSMutableArray *mutableArray = [inputArray mutableCopy]; // if its not mutable already 
[mutableArray sortUsingSelector:@selector(compare:)]; 

NSInteger inputIndex=arc4random_uniform(mutableArray.count);  
NSArray *start = [mutableArray subarrayWithRange:NSMakeRange(inputIndex, mutableArray.count-inputIndex)]; 
NSArray *end = [mutableArray subarrayWithRange:NSMakeRange(0, inputIndex)]; 

NSArray *outputArray = [start arrayByAddingObjectsFromArray:end]; 
NSLog(@"%@", outputArray); 
+0

Вы знаете, что ваш ответ добавляет ** Nothing ** к тому, что сказал @ KonsolLabapen, правильно? Если человек, который задает вопрос, действительно нуждается в большей помощи, чем то, что сказал Консол, возможно, это не сайт для них. Ответ Консола может быть реализован в таком разном порядке. Поэтому следует ли мне менять порядок, предоставлять код и называть его другим ответом? :) На самом деле, я считаю, вы имеете в виду хорошо. Я просто хочу предотвратить больше того же ответа от других. –

+0

@ KatedralPillon Я оставил ответ, потому что думал, что он добавляет * что-то *. Нет неуважения к @ Консолю, но это алгоритмическое предложение («sort & split»), так же, как повторение вопроса. Кажется, что OP нуждается в помощи в том, как сортировать, разделять/присоединяться, единообразные randoms, NSRange и т. Д. Код, который я поставил, является кратким и новым в этой теме. Вы могли бы сказать, что вопрос слишком исправен для SO, и вы можете быть правы. Это сложная линия, чтобы судить, но она прошла порог для меня. Во всяком случае, я действительно имел в виду хорошо. – danh

+0

I плюс один. Большой аргумент. –

3

Это действительно проблема с алгоритмом, а не проблема с iOS. Вот шаги, чтобы следовать

  • сделать отметку о вашем случайно выбранный номер
  • сортировки массива в порядке убывания, как обычно (как в Sort an NSArray in Descending Order)
  • Затем разделить массив на месте вашего специальный номер (по аналогии с How to split an NSArray into two equal pieces?)
  • после раскола создать новый массив, в котором вторая часть теперь приходит первый

Другим решением является создание кругового массива отсортированных элементов, а затем перемещение массива в обратном порядке.

+0

Я скучаю по возрастанию по убыванию: исправление прост: не делайте нисходящего, когда вы применяете alforithm. Также, если вы решите использовать круглый массив, не читайте его в обратном порядке. –

0
int count = (int)[activePlayersArray count]; 
int n = (arc4random() % nElements) + i; 
NSMutableArray *temp = [[NSMutableArray alloc] init]; 
for (int i = 0; i < count; ++i) { 
    int nElements = count - i; 
    [temp addObject:[activePlayersArray objectAtIndex:(n-i)%count]]; 
} 
activePlayersArray = [NSArray arrayWithArray:temp]; 

Надеюсь, он сработает!