Как отсортировать словарь по номерам значений Swift 4 [дублировать]

Вы можете попытаться использовать countApprox в RDD API, хотя это также запускает задачу Spark, она должна быть быстрее, поскольку она просто дает вам оценку истинного счета в течение определенного времени, которое вы хотите потратить (миллисекунды) и доверительный интервал (т. е. вероятность того, что истинное значение находится в этом диапазоне):

пример использования:

val cntInterval = df.rdd.countApprox(timeout = 1000L,confidence = 0.90)
val (lowCnt,highCnt) = (cntInterval.initialValue.low, cntInterval.initialValue.high)

Вам нужно немного сыграть с параметрами timeout и confidence. Чем выше тайм-аут, тем точнее расчетный счет.

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 21 August 2018 в 21:28
поделиться
  • 1
    Лучший ответ для меня! благодаря – Ludovic 3 July 2015 в 16:49
  • 2
    let ans = anArray.sorted {$ 0.localizedStandardCompare ($ 1) == NSComparisonResult.OrderedAscending} sortedArray – Leo Dabus 3 July 2015 в 17:04
  • 3
    @LeoDabus, это короче, но я нахожу, что мой и немного (чуть длиннее) синтаксис немного легче читать с первого взгляда, особенно для новичков. – Duncan C 3 July 2015 в 17:36
  • 4
    Привет, Мартин, Спасибо, что ответил, и для меня это лучший ответ, также как комментарий Людовика – Dennis Garcia 7 July 2015 в 11:07
  • 5
    Swift 3: пусть myArray = [«Шаг 6», «Шаг 12», «Шаг 10»], пусть ans = myArray.sorted {(s1, s2) - & gt; Bool в ответ s1.localizedStandardCompare (s2) == ComparisonResult.orderedAscending} – Ahmad F 28 September 2016 в 13:32

Сортировка в 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 21 August 2018 в 21:28
поделиться

Ответ 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 21 August 2018 в 21:28
поделиться

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 21 August 2018 в 21:28
поделиться
  • 1
    Кастинг на NSString не требуется. Пока импортируется Foundation, методы также доступны для String. – Martin R 3 July 2015 в 15:13
  • 2
    let ans = myArray.sorted {$ 0.compare ($ 1, options: .NumericSearch) == NSComparisonResult.OrderedAscending} – Leo Dabus 3 July 2015 в 17:02
  • 3
    Привет, Дункан С, Спасибо, что на время, отвечая на мой вопрос, правильный ответ я ценю, но я нахожу лучший ответ. – Dennis Garcia 7 July 2015 в 11:12
  • 4
    Если вы нашли лучший ответ, тогда вы должны опубликовать его как ответ на свой вопрос и принять его. – Duncan C 7 July 2015 в 14:13

В 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 21 August 2018 в 21:28
поделиться
  • 1
    Привет, oisdk, Спасибо, что на время отвечаю, что я благодарен за ваш ответ, это было правильно, но я нашел лучший ответ – Dennis Garcia 7 July 2015 в 11:09

Вы можете использовать цикл, равный длине массива, 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 21 August 2018 в 21:28
поделиться
  • 1
    Это не затрагивает проблему сортировки строк в соответствии с их числовым значением (например, «Шаг 6» и «Шаг 10», «Шаг 12»). Также это не компилируется в Swift. – Martin R 9 May 2017 в 14:23
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 21 August 2018 в 21:28
поделиться
Другие вопросы по тегам:

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