Swift Arts of Ints - Найти индекс, где разница с предыдущим элементом больше 10 - PullRequest
0 голосов
/ 11 февраля 2019

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

let array = [1,3,2,1,4,3,99,3,5,2,1,45]

Я хотел бы создать новый массив - где элемент, отличие которого от предыдущего элемента больше 10, установлен в 0.

// [1,3,2,1,4,3,0,3,5,2,1,0]

В настоящее время я создаю новый массив с разницей, затем фильтрую этот массив, чтобы найти те, которые больше 10, и затем сравниваю эти массивы - что, я чувствую, все усложняет.

let diffArray = zip(array.dropFirst(), array).map(-) 
let filteredArray = diffArray.filter {abs($0) > 10}

Спасибо!

Ответы [ 5 ]

0 голосов
/ 11 февраля 2019

Кажется, есть несоответствие между вашим требованием и вашим примером.

"элемент, чье отличие от предыдущего элемента больше 10, имеет значение 0", должен привести к:

[1, 3, 2, 1, 4, 3, 0, 0, 5, 2, 1, 0]

, но ваш примерный результат равен [1,3,2, 1,4,3,0,3,5,2,1,0], что говорит о том, что разница фактически равна «преобразованному» значению предыдущего элемента.

Итак, для заявленного требования,Вы можете сделать это так:

let filteredArray = array.enumerated().map{ $0 > 0 && abs($1 - array[$0-1]) > 10 ? 0 : $1 }

или вот так:

let filteredArray = zip([array[0]]+array,array).map{ abs($0-$1) > 10 ? 0 : $1 }

, которые оба производят:

[1, 3, 2, 1, 4, 3, 0, 0, 5, 2, 1, 0]

Но, чтобы соответствовать вашему примерурезультат (разница с предыдущим преобразованным значением), вы должны сделать это:

let filteredArray = array.dropFirst().reduce([array[0]]){$0 + [abs($1-$0.last!)>10 ? 0 : $1]}

, что дает:

[1, 3, 2, 1, 4, 3, 0, 3, 5, 2, 1, 0]
0 голосов
/ 11 февраля 2019

Алгоритм достаточно прост: переберите все числа, начиная со второго, и замените те, которые больше на 10, чем прецедент.Теперь, с возможностями массива Swift, это можно сделать одним вызовом функции:

let array = [1,3,2,1,4,3,99,3,5,2,1,45]

let filteredNumbers = array.indices.map { i in i > 0 && array[i] - array[i-1] > 10 ? 0 : array[i] }

Несколько сложное решение, но оно позволяет избежать доступа к массиву по индексу и, следовательно, может применяться к любой последовательности./ коллекция:

let filteredNumbers = array.reduce(into: (0, [Int]())) { $0.1.append($1-$0.0 > 10 ? 0 : $1); $0.0 = $1 }.1
0 голосов
/ 11 февраля 2019

Итак, первый элемент остается таким, какой он есть, а следующие элементы отображаются.Если отличие элемента от исходного массива с индексом -1 больше 10, элемент «заменяется» на 0

let array = [1,3,2,1,4,3,99,3,5,2,1,45]

var temp = array
let mapped = [temp[0]] + temp.dropFirst().enumerated().map {
    let condition = abs(temp[$0.offset] - $0.element) > 10
    if condition { temp[$0.offset + 1] = 0 }
    return condition ? 0 : $0.element
}

print(mapped) // [1,3,2,1,4,3,0,3,5,2,1,0]

... если вы не хотите считать с замененными элементами, просто удалите настройкуэлементы temp массива

let array = [1,3,2,1,4,3,99,3,5,2,1,45]

let mapped = [array[0]] + array.dropFirst().enumerated().map {
    let condition = abs(array[$0.offset] - $0.element) > 10
    return condition ? 0 : $0.element
}

print(mapped) // [1,3,2,1,4,3,0,0,5,2,1,0]

В качестве альтернативы, например, если вы хотите просто изменить текущий массив, вы можете добавить этот метод к расширению Array из Int

var array = [1,3,2,1,4,3,99,3,5,2,1,45]

extension Array where Element == Int {

    mutating func replace(difference: Int) {
        guard count > 0 else { return }
        self = [self[0]] + self.dropFirst().enumerated().map {
            let condition = abs(self[$0.offset] - $0.element) > difference
            if condition { self[$0.offset + 1] = 0 }
            return condition ? 0 : $0.element
        }
    }

}

array.replace(difference: 10)
print(array) // [1,3,2,1,4,3,0,3,5,2,1,0]
0 голосов
/ 11 февраля 2019

Вы можете отобразить массив, сохраняя при этом отслеживание предыдущего элемента:

let a = [1,3,2,1,4,3,99,3,5,2,1,45]

var previous = a.first ?? 0
let b = a.map { elem -> Int in
    defer { previous = elem }
    return elem - previous > 10 ? 0 : elem
}

print(b)
// [1, 3, 2, 1, 4, 3, 0, 3, 5, 2, 1, 0]
0 голосов
/ 11 февраля 2019

Это должно сделать это.Ничего особенного.

let array = [1,3,2,1,4,3,99,3,5,2,1,45]

func resetValues(withDifference difference: Int, in array: inout [Int]) {
    for index in array.indices.dropFirst() {
        if abs(array[index - 1] - array[index]) >= 10 {
            array[index] = 0
        }
    }
}

resetValues(withDifference: 10, in: &array)
print(array)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...