Создание массива на основе процентной разницы каждого значения предыдущего элемента - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть следующий массив:

var array: [Double] = [4, 5, 2, 4, 3, 6]

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

var newArray = [0, 25, -60, 100, -25, 100]

Если это имеет смысл? Любая помощь очень ценится, большое спасибо !!

Ответы [ 4 ]

0 голосов
/ 04 сентября 2018

Одна строка: вы можете перебирать индексы и вычислять результат:

let array: [Double] = [4, 5, 2, 4, 3, 6]
let newArray = array.indices.map { i in (array[i] - array[max(0,i-1)]) / array[max(0, i-1)] * 100.0 }
print(newArray) // [0.0, 25.0, -60.0, 100.0, -25.0, 100.0]

Имеет незначительное дублирование кода, однако он работает эффективно, я бы сказал:)

0 голосов
/ 03 сентября 2018

Вы можете сделать это так:

func percentageDifference(num1: Double, num2: Double) -> Double {
    return (num2 - num1) / num1 * 100
}

var array: [Double] = [4, 5, 2, 4, 3, 6]
var resultArray: [Double] = [0]

for i in (1..<array.count) {
    resultArray.append(percentageDifference(num1: array[i-1], num2: array[i]))
}
0 голосов
/ 04 сентября 2018

Вы можете использовать var, чтобы сохранить ссылку на последний элемент, и использовать defer, чтобы обновить его внутри карты:

extension Collection where Element: FloatingPoint {
    var percentageDifference: [Element] {
        guard var last = first else { return [] }
        return map { element in
            defer { last = element }
            return (element - last) / last * 100
        }
    }
}

let numbers: [Double] = [4, 5, 2, 4, 3, 6]
let percentageDifference = numbers.percentageDifference
print(percentageDifference)   // "[0.0, 25.0, -60.0, 100.0, -25.0, 100.0]\n"
0 голосов
/ 03 сентября 2018

Это удобно сделать с помощью zip() для перечисления по парам. смежных элементов массива:

let array: [Double] = [4, 5, 2, 4, 3, 6]

let percentages = [0] + zip(array, array.dropFirst()).map {
    (old, new) in
    return 100.0 * (new - old) / old
}

print(percentages) // [0.0, 25.0, -60.0, 100.0, -25.0, 100.0]

(Предполагается, что ни один из элементов массива не равен нулю.)

Или с сокращенным синтаксисом:

let percentages = [0] + zip(array, array.dropFirst()).map {
    100.0 * ($1 - $0) / $0
}
...