Повторите определенный элемент массива - PullRequest
0 голосов
/ 15 ноября 2018

Как заменить или повторить определенный элемент (v) массива в Swift 3/4:

["A","s","B","v","C","s","D","v","E","s"]

чтобы получить это:

["A","s","B","v","v","C","s","D","v","v","E","s"]

или это:

["A","s","B","v","v","v","C","s","D","v","v","v","E","s"]
["A","s","B","v","v","v","v","C","s","D","v","v","v","v","E","s"]

Причина в том, что элемент v вставляет паузы (с) между аудиофайлами (A, B, C, ...). Количество повторений элемента v должно быть установлено с помощью SegmentedControl (1,2, ..., 6).

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Быстрый вынос

extension Array where Element == String  {
    func repeatItem(_ item: Element, times n: Int) -> Array<Element> {
        return flatMap { $0 == item ? Array(repeating: $0, count: n) : [$0]     }
    }
}

Подробные пояснения

Использование flatMap:

yourArray.flatMap { $0 == "v" ? [$0, $0] : [$0] }

По сути, это проверяет каждый элемент массива.Если это "v", включите его в ["v", "v"].Если это не "v", превратите его в массив с этим единственным элементом.Затем он выравнивает все эти массивы, поэтому flatMap.

Вы также можете утроить определенный элемент:

yourArray.flatMap { $0 == "v" ? [$0, $0, $0] : [$0] }

Или повторить его n раз:

yourArray.flatMap { $0 == "v" ? Array(repeating: $0, count: n) : [$0] }

Используйте игровую площадку, чтобы проверить это:

//: Playground - noun: a place where people can play
import Foundation

var inputArray = ["A","s","B","v","C","s","D","v","E","s"]
var expectArray2 = ["A","s","B","v","v","C","s","D","v","v","E","s"]
var expectArray3 = ["A","s","B","v","v","v","C","s","D","v","v","v","E","s"]
var expectArray4 = ["A","s","B","v","v","v","v","C","s","D","v","v","v","v","E","s"]

extension Array where Element == String  {
    func repeatItem(_ item: Element, times n: Int) -> Array<Element> {
        return flatMap { $0 == item ? Array(repeating: $0, count: n) : [$0] }
    }
}

print(inputArray.repeatItem("v", times: 2) == expectArray2)
print(inputArray.repeatItem("v", times: 3) == expectArray3)
print(inputArray.repeatItem("v", times: 4) == expectArray4)
0 голосов
/ 15 ноября 2018
let array : [String] = ["A","s","B","v","C","s","D","v","E","s"]
print(replaceItem(array: array, item: "v"))

//Method

func replaceItem(array : [String], item : String) -> [String] {
    var newAr: [String] = []
    for arItem in array{
        newAr.append(arItem)
        if arItem == item {
            newAr.append(arItem)
        }
    }
    return newAr
}

выход: ["A", "s", "B", "v", "v", "C", "s", "D", "v", "v", "E", "s"]

0 голосов
/ 15 ноября 2018

Вы можете использовать insert(:at:), используя определенный индекс элемента.

var foo = [0,1,2,3,4,5,6,7]
foo.insert(0, at: foo[0])

выход

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

Вы можете заключить это в функцию, чтобы повторять столько, сколько вам нужно.

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