.remove(at:i)のようなインデックスの場所を使用して、配列から複数のアイテムを同時に削除することは可能ですか?
擬似コード:
myArray.remove(at: 3, 5, 8, 12)
もしそうなら、これを行うための構文は何ですか?
[〜#〜] update [〜#〜]:
私はこれを試していましたが、うまくいきましたが、以下の答えの拡張子ははるかに読みやすく、賢明であり、擬似コードとまったく同じものの目標を達成しています。
「位置」の配列が作成されます:[3、5、8、12]
let sorted = positions.sorted(by: { $1 < $0 })
for index in sorted
{
myArray.remove(at: index)
}
removeSubrange
メソッドを使用してインデックスが連続している場合は可能です。たとえば、インデックス3〜5のアイテムを削除する場合:
myArray.removeSubrange(ClosedRange(uncheckedBounds: (lower: 3, upper: 5)))
連続していないインデックスの場合、インデックスが大きいアイテムから小さいインデックスを削除することをお勧めします。コードが短くなる可能性があることを除いて、ワンライナーでアイテムを「同時に」削除することについて考えることができる利点はありません。拡張メソッドでこれを行うことができます:
extension Array {
mutating func remove(at indexes: [Int]) {
for index in indexes.sorted(by: >) {
remove(at: index)
}
}
}
次に:
myArray.remove(at: [3, 5, 8, 12])
更新:上記のソリューションを使用して、インデックス配列に重複したインデックスが含まれないようにする必要があります。または、次のように重複を回避できます。
extension Array {
mutating func remove(at indexes: [Int]) {
var lastIndex: Int? = nil
for index in indexes.sorted(by: >) {
guard lastIndex != index else {
continue
}
remove(at: index)
lastIndex = index
}
}
}
var myArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
myArray.remove(at: [5, 3, 5, 12]) // duplicated index 5
// result: [0, 1, 2, 4, 6, 7, 8, 9, 10, 11, 13] only 3 elements are removed
配列要素のインデックスを使用して要素を削除:
文字列とインデックスの配列
let animals = ["cats", "dogs", "chimps", "moose", "squarrel", "cow"]
let indexAnimals = [0, 3, 4]
let arrayRemainingAnimals = animals
.enumerated()
.filter { !indexAnimals.contains($0.offset) }
.map { $0.element }
print(arrayRemainingAnimals)
//result - ["dogs", "chimps", "cow"]
整数とインデックスの配列
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
let indexesToRemove = [3, 5, 8, 12]
numbers = numbers
.enumerated()
.filter { !indexesToRemove.contains($0.offset) }
.map { $0.element }
print(numbers)
//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
別の配列の要素値を使用して要素を削除
整数の配列
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
let elementsTobeRemoved = [3, 5, 8, 12]
let arrayResult = numbers.filter { element in
return !elementsTobeRemoved.contains(element)
}
print(arrayResult)
//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
文字列の配列
let arrayLetters = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
let arrayRemoveLetters = ["a", "e", "g", "h"]
let arrayRemainingLetters = arrayLetters.filter {
!arrayRemoveLetters.contains($0)
}
print(arrayRemainingLetters)
//result - ["b", "c", "d", "f", "i"]
スイフト4
extension Array {
mutating func remove(at indexs: [Int]) {
guard !isEmpty else { return }
let newIndexs = Set(indexs).sorted(by: >)
newIndexs.forEach {
guard $0 < count, $0 >= 0 else { return }
remove(at: $0)
}
}
}
var arr = ["a", "b", "c", "d", "e", "f"]
arr.remove(at: [2, 3, 1, 4])
result: ["a", "f"]
シンプルで明確なソリューション、ちょうどArray
拡張子:
_extension Array {
mutating func remove(at indices: [Int]) {
Set(indices)
.sorted(by: >)
.forEach { rmIndex in
self.remove(at: rmIndex)
}
}
}
_
Set(indices)
-一意性を保証します.sorted(by: >)
-関数は最後から最初に要素を削除するため、削除中にインデックスが適切であることを確認しますNSMutableArray
APIによると、インデックスをIndexSet
として実装することをお勧めします。
順序を逆にするだけです。
extension Array {
mutating func remove(at indexes: IndexSet) {
indexes.reversed().forEach{ self.remove(at: $0) }
}
}
この回答 も参照して、より効率的なアルゴリズムを提供してください。
削除するインデックスのセットを作成できます。
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let indexSet = [3, 5, 8, 12]
indexSet.reversed().forEach{ array.remove(at: $0) }
print(array)
出力:[0、1、2、4、6、6、7、9、10、11]
インデックスが連続している場合は、removeSubrange
を使用します
array.removeSubrange(1...3) /// Will remove the elements from 1, 2 and 3 positions.