Подтвердить что ты не робот

Сортировка массива в алфавитном порядке с номером

myArray = [Step 6, Step 12, Step 5, Step 14, Step 4, Step 11, Step 16, Step 9, 
Step 3, Step 13, Step 8, Step 2, Step 10, Step 7, Step 1, Step 15]

Как я могу отсортировать этот массив выше таким образом?

[Step 1, Step 2, Step 3, Step 4, ....]

Я использовал эту функцию в swift sort(&myArray,{ $0 < $1 }), но был отсортирован таким образом

[Step 1, Step 10, Step 11, Step 12, Step 13, Step 14, Step 15, Step 16, Step 2, 
 Step 3, Step 4, Step 5, Step 6, Step 7, Step 8, Step 9]
4b9b3361

Ответ 1

Другой вариант - использовать localizedStandardCompare:. Из документации:

Этот метод следует использовать всякий раз, когда имена файлов или другие строки представлены в списках и таблицах, где сортировка Finder необходимо.

Это отсортирует строки, соответствующие текущему языку. Пример:

let myArray = ["Step 6", "Step 12", "Step 10"]

let ans = sorted(myArray,{ (s1, s2) in 
    return s1.localizedStandardCompare(s2) == NSComparisonResult.OrderedAscending
})

println(ans)
// [Step 6, Step 10, Step 12]

Обновление:. Вышеприведенный ответ довольно старый и для Swift 1.2. Версия Swift 3 (благодаря @Ahmad):

let ans = myArray.sorted {
    (s1, s2) -> Bool in return s1.localizedStandardCompare(s2) == .orderedAscending
}

Для другого подхода см. fooobar.com/questions/312807/..., переведен в Swift 3 на fooobar.com/questions/312807/....

Ответ 2

Версия Swift 3 ответ Duncan C -

let myArray = ["Step 6", "Step 12", "Step 10"]

let sortedArray = myArray.sorted {
    $0.compare($1, options: .numeric) == .orderedAscending
}

print(sortedArray) // ["Step 6", "Step 10", "Step 12"]

Или, если вы хотите отсортировать массив на месте:

var myArray = ["Step 6", "Step 12", "Step 10"]

myArray.sort {
    $0.compare($1, options: .numeric) == .orderedAscending
}

print(myArray) // ["Step 6", "Step 10", "Step 12"]

Ответ 3

NSString имеет богатый набор методов для сравнения строк. Вы можете использовать метод compare:options:.

Вам понадобится опция NSNumericSearch. Если вы прочитаете описание этого параметра, в нем говорится:

Числа внутри строк сравниваются с использованием числового значения, то есть, Name2.txt < Name7.txt < Name25.txt.

Итак, вы можете написать строку сортировки Swift, которая делает то, что вы хотите использовать эту функцию.

Что-то вроде этого:

let myArray = ["Step 6", "Step 12", "Step 10"]

let ans = myArray.sorted {
    (first, second) in
    first.compare(second, options: .NumericSearch) == NSComparisonResult.OrderedAscending
}

println(ans)
// [Step 6, Step 10, Step 12]

Ответ 4

В Swift 2:

import Foundation

let myArray = ["Step 6", "Step 12", "Step 10"]

extension String {
  func extractIntFromEnd() -> Int? {
    return self.componentsSeparatedByString(" ").last.flatMap{Int($0)}
  }
}

let ans = myArray.sort {
  (first, second) in
  first.extractIntFromEnd() < second.extractIntFromEnd()
}

В Swift 1:

let myArray = ["Step 6", "Step 12", "Step 10"]

extension String {
  func extractIntFromEnd() -> Int? {
    return self.componentsSeparatedByString(" ").last.flatMap{$0.toInt()}
  }
}

let ans = myArray.sorted {
  (first, second) in
  first.extractIntFromEnd() < second.extractIntFromEnd()
}

В обоих этих массивах:

let myArray = [
  "Step 6" ,
  "Step 12",
  "Step 5" ,
  "Step 14",
  "Step 4" ,
  "Step 11",
  "Step 16",
  "Step 9" ,
  "Step 3" ,
  "Step 13",
  "Step 8" ,
  "Step 2" ,
  "Step 10",
  "Step 7" ,
  "Step 1" ,
  "Step 15"
]

Вы получите ответ:

["Step 1", "Step 2", "Step 3", "Step 4", "Step 5", "Step 6", "Step 7", "Step 8", "Step 9", "Step 10", "Step 11", "Step 12", "Step 13", "Step 14", "Step 15", "Step 16"]

(В версии Swift 2.0 вы можете сделать last.flatMap(Int.init), но по какой-то причине она не работает для меня. Даже что-то вроде ["1", "2"].flatMap(Int.init) разбивает мою игровую площадку. Похож на ошибку.)

Ответ 5

Сортировка в Swift 2.0 Демо-ссылка, изменение синтаксиса из "sorted (myArray, {})" в "myArray.sort({})". Расширяемый протокол.

let myArray = ["Step 6", "Step 12", "Step 10"]
let sortedArray = myArray.sort({ x, y in
    return x.localizedStandardCompare(y) == NSComparisonResult.OrderedAscending
})

dump(sortedArray)

Swift 1.2 Demo

Ответ 6

NSArray *assorted = [@"1 2 3 9 ; : 구 , 결 A B C Z ! á" componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSArray *sorted = [assorted sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    /* NSOrderedAscending, NSOrderedSame, NSOrderedDescending */
    BOOL isPunct1 = [[NSCharacterSet punctuationCharacterSet] characterIsMember:[(NSString*)obj1 characterAtIndex:0]];
    BOOL isPunct2 = [[NSCharacterSet punctuationCharacterSet] characterIsMember:[(NSString*)obj2 characterAtIndex:0]];
    if (isPunct1 && !isPunct2) {
        return NSOrderedAscending;
    } else if (!isPunct1 && isPunct2) {
        return NSOrderedDescending;
    }
    return [(NSString*)obj1 compare:obj2 options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch|NSNumericSearch]|;         
}];

Ответ 7

Вы можете использовать цикл, равный длине массива, т.е. for(i=0;i<myArray.length;i++), а затем использовать переменную для сортировки в следующем порядке:

for (int i = 0; i < myArray.length; i++) 
{
  for (int j = i + 1; j < n; j++) 
  {
    if (a[i] > a[j]) 
    {
      temp = a[i];
      a[i] = a[j];
      a[j] = temp;
    }
  }
}