Быстрая работа с кортежами - сортировка и создание отчетов по диапазону значений для каждого ключа - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь извлечь диапазон значений из массива кортежей для каждого уникального значения. В конечном итоге исходные данные - это JSON, и я выбираю различные местоположения и время сопоставления для данных о встречах и помещаю их в кортеж для временного хранения и манипулирования данными (возможно, я делаю это более сложным, чем это должно быть).

Мой массив - это местоположение и время, например:

var tuple_array = [("Clinic", "1200"), ("ASC", "0900"), ("Clinic", "1300"), ("ASC", "0830"), ("Clinic", "1400")]

В конечном итоге я хотел бы получить отчет, в котором говорится: «У вас есть 2 приема в« ASC »с 0830-0900 и 3 приема в« Клинике »с 1200-1400».

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

Чтобы получить уникальные значения, которые я запустил:

let test = tuple_array.map { $0.0 }
let uniqueValues = test.reduce([], { $0.contains($1) ? $0 : $0 + [$1] })

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

future_appts_counts_location_time_array.sort {$0.1 == $1.1 ? $0.1 < $1.1 : $0.1 < $1.1 }

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

Любой совет?

Спасибо!

1 Ответ

0 голосов
/ 31 октября 2018

Есть конструктор словаря, который действительно поможет вам:

let placeTimes = Dictionary(grouping: tuple_array, by: { $0.0 })
    .mapValues { $0.map { $0.1 }.sorted() }

Конструктор создаст словарь, где ключи - это места, а значения - это кортежи. mapValues возьмет массив кортежей, отрежет первую часть и затем отсортирует последнюю часть.

Вышеуказанное не гарантирует, что места будут в алфавитном порядке. Если вам нужно, вы можете нажать .sorted(by: { $0.0 < $1.0 }) после команды mapValues.

let descriptions = placeTimes.map { arg -> String in
    let (key, value) = arg
    switch value.count {
    case 0:
        return "no appointments at \"\(key)\""
    case 1:
        return "1 appointment at \"\(key)\" at \(value.first!)"
    default:
        return "\(value.count) appointments at \"\(key)\" from \(value.first!)-\(value.last!)"
    }
    }
    .joined(separator: " and ")
print("You have \(descriptions)")

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

...