Как отсортировать массив объектов по цене? [Дубликат]

Понимаете, у вас есть небольшая ошибка.

if True:
    if False:
        print('foo')
   print('bar')

Вы должны были делать:

if True:
    if False:
        print('foo')
    print('bar')

Как вы можете видеть, ваша печать имеет только отступы 3 пробела, он должен иметь отступы 4 пробела.

24
задан Liam 3 July 2015 в 14:43
поделиться

7 ответов

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

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

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

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
}

Для другого подхода см. https://stackoverflow.com/a/31209763/1187415 , переведенный на Swift 3 в https://stackoverflow.com/a/39748677/1187415 .

31
ответ дан Martin R 26 August 2018 в 05:29
поделиться

Сортировка в 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

0
ответ дан Abhijeet 26 August 2018 в 05:29
поделиться

Ответ 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"]
9
ответ дан Community 26 August 2018 в 05:29
поделиться

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

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

Числа внутри строк сравниваются с помощью числового значения, то есть Name2.txt & lt; Name7.txt & lt; 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]
7
ответ дан Duncan C 26 August 2018 в 05:29
поделиться

В 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) разбивает мою игровую площадку. Похож на ошибку.)

6
ответ дан oisdk 26 August 2018 в 05:29
поделиться

Вы можете использовать цикл, равный длине массива, i.e. 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;
    }
  }
}
0
ответ дан Paul Roub 26 August 2018 в 05:29
поделиться
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]|;         
}];
0
ответ дан ΩlostA 26 August 2018 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: