web-dev-qa-db-ja.com

Swift 3配列、.remove(at:i)を使用して複数のアイテムを一度に削除します

.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)
}
17
Confused

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
22
Thanh Pham

配列要素のインデックスを使用して要素を削除:

  1. 文字列とインデックスの配列

    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"]
    
  2. 整数とインデックスの配列

    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]
    



別の配列の要素値を使用して要素を削除

  1. 整数の配列

    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]
    
  2. 文字列の配列

    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"]
    
18
Krunal

スイフト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"]
6
linh luu phuoc

シンプルで明確なソリューション、ちょうどArray拡張子:

_extension Array {

    mutating func remove(at indices: [Int]) {
        Set(indices)
            .sorted(by: >)
            .forEach { rmIndex in
                self.remove(at: rmIndex)
            }
    }
}
_
  • Set(indices)-一意性を保証します
  • .sorted(by: >)-関数は最後から最初に要素を削除するため、削除中にインデックスが適切であることを確認します
5

NSMutableArray AP​​Iによると、インデックスをIndexSetとして実装することをお勧めします。

順序を逆にするだけです。

extension Array {

    mutating func remove(at indexes: IndexSet) {
        indexes.reversed().forEach{ self.remove(at: $0) }
    }
}

この回答 も参照して、より効率的なアルゴリズムを提供してください。

1
vadian

削除するインデックスのセットを作成できます。

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.
1
TheTiger