从数组中删除多个索引

时间:2015-04-28 03:38:29

标签: swift

我有一个数组,我想删除一堆索引

var arr = [0,1,2,3,4,5,6]
var rmIndices = [1,4,5]

从arr中删除指数1,4,5的最佳方法是什么?

8 个答案:

答案 0 :(得分:20)

请注意[2, 6, 0, 3]在Swift 3中消失了,并且不会保持顺序相同,尽管它可能同时执行。使用接受的答案会导致[0, 2, 3, 6],这可能是意料之外的。给出let flatArr = arr.enumerate().flatMap { rmIndices.contains($0.0) ? nil : $0.1 } 预期结果的几种替代方法是:

let filterArr = arr.enumerate().filter({ !rmIndices.contains($0.0) }).map { $0.1 }

--upgrade

答案 1 :(得分:9)

不是要删除的索引列表,而是可以更容易地保留索引列表,您可以使用Set类型执行此操作:

let rmIndices = [1,4,5]
let keepIndices = Set(arr.indices).subtract([1,4,5])

然后你可以使用PermutationGenerator创建一个只有那些索引的新数组:

arr = Array(PermutationGenerator(elements: arr, indices: keepIndices))

答案 2 :(得分:6)

rmIndices.sort({ $1 < $0 })     

for index in rmIndices
{
    arr.removeAtIndex(index)
}

请注意,我已按降序对索引进行排序。这是因为每次删除 E 元素时, E 之外的元素索引减1。

答案 3 :(得分:1)

对于Swift 3

    var arr = [0,1,2,3,4,5,6]
    let rmIndices = [1,4,5]
    arr = arr.filter{ !rmIndices.contains($0) }
    print(arr)

如果您想快速生成输出,那么您可以使用

    var arr = [0,1,2,3,4,5,6]
    let rmIndices = [1,4,5]
    arr = Array(Set(arr).subtracting(rmIndices))
    print(array)

但它会改变数组的顺序

答案 4 :(得分:1)

使用索引数组删除元素:

  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]
    


  3. 使用其他数组的元素值删除元素

    1. 整数数组

      let arrayResult = numbers.filter { element in
          return !indexesToRemove.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"]
      

答案 5 :(得分:0)

flatmap的问题在于,如果您的数组包含选项,它会给出错误的结果。

以下内容比提供的功能样式解决方案快得多,并且可以与选项一起使用。您只需确保rmIndices已排序且唯一。它也是语言无关的。

 var numRemoved: Int = 0
 for index in rmIndices {
     let indexToRemove = index - numRemoved
     arr.remove(at: indexToRemove)
     numRemoved += 1
 }

如果您需要确保rmIndices已排序且唯一:

 rmIndices = Set(rmIndices).sorted()

使用XCTest删除500个元素(包括确保唯一性和排序的操作):

0.006秒

VS。

arr.enumerated().filter({ !rmIndices.contains($0.0) }).map { $0.1 }

0.206秒

我将它用作Array

的扩展名
extension Array {

    mutating func remove(at indices: [Int]) {
        let rmIndices = Set(indices).sorted()
        var numRemoved: Int = 0
        for index in rmIndices {
            let indexToRemove = index - numRemoved
            self.remove(at: indexToRemove)
            numRemoved += 1
        }
    }

}

答案 6 :(得分:0)

在Swift 4中:

let newArr = arr.enumerated().compactMap {
    rmIndices.contains($0.0) ? nil : $0.1
}
  • enumerated()生成(索引,值)对
  • compactMap连接非nil值
  • 在闭包中,$0.0是索引(枚举对的第一个元素),因为$ 0.1 $是值
  • compactMap收集在rmIndices
  • 中找不到其索引的值

答案 7 :(得分:0)

使用lodash https://lodash.com/

var arr = [0,1,2,3,4,5,6]
var rmIndices = [1,4,5]
_.pullAt(arr, rmIndices);