Сортировать массив типа UnitMass - PullRequest
1 голос
/ 31 марта 2020

Итак, я хочу отсортировать массив UnitMass, но я хочу отсортировать его в заданном c макете. Я знаю, как сортировать по алфавиту, но это не совсем то, что я хочу, чтобы кто-нибудь знал, как я могу это сделать?

Можно ли отсортировать массив таким образом, и как я могу это сделать или я могу определить как должен выглядеть массив?

let spesificLayoutOfUnits =[ UnitMass.grams, UnitMass.kilograms, UnitMass.metricTons, UnitMass.stones, UnitMass.pounds, UnitMass.ounces ]
var toBeSorted = [ UnitMass.kilograms, UnitMass.pounds, UnitMass.metricTons, UnitMass.ounces, UnitMass.grams ]

Я использую массив spesificLayoutOfUnits в качестве массива всех опций, которые есть у пользователя. Затем добавьте единицы из этого массива в массив toBeSorted, который является массивом выбранных единиц.

var options = spesificLayoutOfUnits as! [UnitMass]
var tempArray = [UnitMass]()
while toBeSorted.endIndex > positionOfUnit {
   tempArray.append(toBeSorted.removeLast())
}
toBeSorted.append(options.remove(at: positionOfUnit))
while !tempArray.isEmpty {
    toBeSorted.append(tempArray.removeLast())
}

1 Ответ

1 голос
/ 31 марта 2020

Я бы предложил создать словарь, который отображает UnitMass в желаемое положение, а затем использовать его для сортировки:

let specificLayoutOfUnits = [ UnitMass.grams, UnitMass.kilograms, UnitMass.metricTons, UnitMass.stones, UnitMass.pounds, UnitMass.ounces ]

// Create a dictionary to map UnitMass to Int position   
var position = [UnitMass : Int]()

for (idx, um) in specificLayoutOfUnits.enumerated() {
    position[um] = idx
}

var toBeSorted = [ UnitMass.kilograms, UnitMass.pounds, UnitMass.metricTons, UnitMass.ounces, UnitMass.grams ]

// Sort the array by position.  Use Int.max if the UnitMass has no
// position to sort it to the end of the array
let sorted = toBeSorted.sorted { position[$0, default: Int.max] < position[$1, default: Int.max] }

Объяснение:

  1. вызов .enumerated() для specificLayoutOfUnits создает список кортежей, где первый элемент - это позиция, а второй - единица измерения: [(0, UnitMass.grams), (1, UnitMass.kilograms), (2, UnitMass.metricTons), ...].
  2. Далее мы перебираем этот список создать словарь, который отображает единицу измерения в ее позицию: [UnitMass.grams: 0, UnitMass.kilograms: 1, UnitMass.metricTons: 2, ...]
  3. Этот словарь используется для сортировки второго массива по позиции элементов в первом. .sorted(by:) принимает замыкание, которое сравнивает два элемента и возвращает Bool, в котором говорится, упорядочен ли первый элемент перед вторым. Здесь мы используем положение двух элементов в первом массиве, чтобы определить порядок. Обратите внимание, что возможно иметь элемент во втором массиве, который не появляется в первом. В этом случае мы используем специальную версию поиска по словарю, чтобы вернуть Int.max для позиции. Это приведет к тому, что все значения UnitMass без позиции будут отсортированы в конец массива.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...