Каков наиболее эффективный способ проверки каждого числа в последовательности на последовательность диапазонов? - PullRequest
2 голосов
/ 12 апреля 2020

У меня есть два массива. Первая последовательность представляет собой список двойников. Второй - это список диапазонов. Последовательности и массивы всегда имеют одинаковую длину. Какой самый эффективный способ проверить, находится ли каждый элемент в первом массиве в пределах диапазона с тем же индексом во втором массиве?

Есть ли эффективный способ сделать это с какой-нибудь библиотекой матриц?

Фрагмент того, чего я пытаюсь достичь:

let A: [Double] = [1, 2, 3, 4, 5]
let B: [Range] = [0..2, 1..3, 2..4, 5..6, 7..8]

// TODO: Test each item in A against the range in B at the same index
// e.g. (0..2).contains(1) && (1..3).contains(2) && ... so on

Я хочу получить True, если все элементы совпадают, и false в противном случае. Мне нужно выполнить этот тест в al oop, поэтому я хотел бы найти наиболее эффективный способ сделать это сравнение.

Ответы [ 2 ]

4 голосов
/ 12 апреля 2020

Я бы, наверное, сделал что-то вроде:

func all(_ values: [Double], in ranges: [Range<Double>]) -> Bool {
    zip(values, ranges).allSatisfy { $1 ~= $0 }
}

Таким образом

let values: [Double] = [1,4,3]
let ranges: [Range<Double>] = [
    0..<3,
    1..<5,
    2..<6
]

let result = all(values, in: ranges)

Чтобы не затушевать проблему, но я бы, вероятно, сделал ее обобщенной c , поскольку нет причин, по которым он должен быть ограничен определенным типом или определенным типом диапазона:

func all<T, U: RangeExpression>(_ values: [T], in ranges: [U]) -> Bool where U.Bound == T {
    zip(ranges, values).allSatisfy(~=)
}

И, как указала Джесси, если вы включите его, чтобы использовать zip(ranges, values), тогда вы можете использовать allSatisfy(~=).

2 голосов
/ 12 апреля 2020

Вы могли бы сделать что-то вроде этого:

let doubles: [Double] = [1.0, 2.0, 4.7, 2.5, 1.1]
let ranges: [ClosedRange<Double>] = [0...2, 1...2, 1...5, -1...3, 1...2]

let result = zip(doubles, ranges).allSatisfy { $1.contains($0) }

result - это логическое значение, которое должно быть true, если заданные двойные значения находятся в заданных диапазонах, в противном случае оно должно быть false. Имейте в виду, что если число обоих массивов отличается, результат будет false.

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