Удалить выбранный индекс из массива [duplicate]

width = 5
num = 3
formatted = (width - len(str(num))) * "0" + str(num)
print formatted
149
задан overactor 9 June 2016 в 12:55
поделиться

16 ответов

Ключевое слово let - это объявление констант, которые нельзя изменить. Если вы хотите изменить переменную, вы должны использовать var вместо этого, например:

var animals = ["cats", "dogs", "chimps", "moose"]

animals.remove(at: 2)  //["cats", "dogs", "moose"]

Альтернатива без мутаций, которая сохранит исходную коллекцию без изменений, заключается в использовании filter для создания новой коллекции без элементов, которые вы хотите удалить, например:

let pets = animals.filter { $0 != "chimps" }
189
ответ дан mythz 25 August 2018 в 00:21
поделиться

Если у вас есть массив пользовательских объектов, вы можете выполнить поиск по определенному свойству:

    if let index = doctorsInArea.indexOf({$0.id == doctor.id}){
        doctorsInArea.removeAtIndex(index)
    }

или если вы хотите искать по имени, например

    if let index = doctorsInArea.indexOf({$0.name == doctor.name}){
        doctorsInArea.removeAtIndex(index)
    }
2
ответ дан Abo3atef 25 August 2018 в 00:21
поделиться

Это должно сделать это (не проверено):

animals[2..3] = []

Изменить: вам нужно сделать var, а не let, в противном случае это постоянная константа.

2
ответ дан Analog File 25 August 2018 в 00:21
поделиться

Если вы не знаете индекс элемента, который хотите удалить, и элемент соответствует протоколу Equatable, вы можете сделать:

animals.removeAtIndex(animals.indexOf("dogs")!)

См. Ответ на условный протокол: Как сделать indexOfObject или надлежащий containsObject

133
ответ дан Community 25 August 2018 в 00:21
поделиться

Как и в Xcode 10+, и в соответствии с WWDC 2018 сеансом 223, «Embracing Algorithms», , хороший способ продвижения будет mutating func removeAll(where predicate: (Element) throws -> Bool) rethrows

Пример Apple:

var phrase = "The rain in Spain stays mainly in the plain."
let vowels: Set<Character> = ["a", "e", "i", "o", "u"]

phrase.removeAll(where: { vowels.contains($0) })
// phrase == "Th rn n Spn stys mnly n th pln."

см. Документация от Apple

Итак, в примере OP, удаляя животных [2], «шимпанзе»:

var animals = ["cats", "dogs", "chimps", "moose"]
animals.removeAll(where: { $0 == "chimps" } )
// or animals.removeAll { $0 == "chimps" }

Этот метод может быть предпочтительнее, потому что он хорошо масштабируется (линейный и квадратичный), является читаемым и чистым. Имейте в виду, что он работает только в Xcode 10+, а с момента написания - в бета-версии.

3
ответ дан davidrynn 25 August 2018 в 00:21
поделиться
   var indexForDelete = 0
   let yourArray = [String]()  
   let newArray = [String]()  

    for obj in yourArray {
          if conduction == true{
            newArray.append(obj) //all object which is you want to add in second array (newArray)
          }else{
  //all remaining object which is you want to delete from yourArray
         }


        }

// теперь ваш newArray фильтруется

-4
ответ дан Er. Deependra Thakur 25 August 2018 в 00:21
поделиться

Вы могли бы это сделать. Сначала убедитесь, что Dog действительно существует в массиве, а затем удалите его. Добавьте инструкцию for, если вы считаете, что Dog может произойти более одного раза в вашем массиве.

var animals = ["Dog", "Cat", "Mouse", "Dog"]
let animalToRemove = "Dog"

for object in animals
{
    if object == animalToRemove{
        animals.removeAtIndex(animals.indexOf(animalToRemove)!)
    }
}

Если вы уверены, что Dog завершает работу в массиве и происходит только один раз, выполните следующее:

animals.removeAtIndex(animals.indexOf(animalToRemove)!)

Если у вас есть и строки, и числа

var array = [12, 23, "Dog", 78, 23]
let numberToRemove = 23
let animalToRemove = "Dog"

for object in array
{

    if object is Int
    {
        // this will deal with integer. You can change to Float, Bool, etc...
        if object == numberToRemove
        {
        array.removeAtIndex(array.indexOf(numberToRemove)!)
        }
    }
    if object is String
    {
        // this will deal with strings
        if object == animalToRemove
        {
        array.removeAtIndex(array.indexOf(animalToRemove)!)
        }
    }
}
13
ответ дан GuiSoySauce 25 August 2018 в 00:21
поделиться

Я использую это расширение, почти такое же, как у Varun, но этот (ниже) является универсальным:

 extension Array where Element: Equatable  {
        mutating func delete(element: Iterator.Element) {
                self = self.filter{$0 != element }
        }
    }
0
ответ дан Jsleshem 25 August 2018 в 00:21
поделиться

Удалить элементы с использованием массива индексов:

  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. Массивы целых чисел
    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"]
    
7
ответ дан Krunal 25 August 2018 в 00:21
поделиться

Я придумал следующее расширение, которое заботится об удалении элементов из Array, предполагая элементы в реализации Array Equatable:

extension Array where Element: Equatable {

  mutating func removeEqualItems(item: Element) {
    self = self.filter { (currentItem: Element) -> Bool in
      return currentItem != item
    }
  }

  mutating func removeFirstEqualItem(item: Element) {
    guard var currentItem = self.first else { return }
    var index = 0
    while currentItem != item {
      index += 1
      currentItem = self[index]
    }
    self.removeAtIndex(index)
  }

}

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

var test1 = [1, 2, 1, 2]
test1.removeEqualItems(2) // [1, 1]

var test2 = [1, 2, 1, 2]
test2.removeFirstEqualItem(2) // [1, 1, 2]
2
ответ дан nburk 25 August 2018 в 00:21
поделиться

В отношении альтернативы @ Suragch для «Удалить элемент неизвестного индекса»:

Существует более мощная версия «indexOf (element)», которая будет соответствовать предикату, а не самому объекту. Он имеет одно имя, но он называется myObjects.indexOf {$ 0.property = valueToMatch}. Он возвращает индекс первого совпадающего элемента, найденного в массиве myObjects.

Если элемент является объектом / структурой, вы можете удалить этот элемент на основе значения одного из его свойств. Например, у вас есть класс Car, у которого есть свойство car.color, и вы хотите удалить «красный» автомобиль с вашего автомобиля.

if let validIndex = (carsArray.indexOf{$0.color == UIColor.redColor()}) {
  carsArray.removeAtIndex(validIndex)
}

Возможно, вы можете переделать это, чтобы удалить «все» красные автомобили путем вложения вышеприведенного оператора if в цикл repeat / while и присоединения блока else, чтобы установить флаг «break» из цикла.

5
ответ дан ObjectiveTC 25 August 2018 в 00:21
поделиться

Swift 3: Это классное и простое расширение для удаления элементов в массиве без фильтрации:

extension Array where Element: Equatable {

    // Remove first collection element that is equal to the given `object`:
    mutating func remove(object: Element) {
        if let index = index(of: object) {
            remove(at: index)
        }
    }
}

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

var myArray = ["cat", "barbecue", "pancake", "frog"]
let objectToRemove = "cat"

myArray.remove(object: objectToRemove) // ["barbecue", "pancake", "frog"]
11
ответ дан Skaal 25 August 2018 в 00:21
поделиться

Задано

var animals = ["cats", "dogs", "chimps", "moose"]

Удалить первый элемент

animals.removeFirst() // "cats"
print(animals)        // ["dogs", "chimps", "moose"]

Удалить последний элемент

animals.removeLast() // "moose"
print(animals)       // ["cats", "dogs", "chimps"]

Удалить элемент по индексу

animals.remove(at: 2) // "chimps"
print(animals)           // ["cats", "dogs", "moose"]

Удалить элемент неизвестного индекса

Только для одного элемента

if let index = animals.index(of: "chimps") {
    animals.remove(at: index)
}
print(animals) // ["cats", "dogs", "moose"]

Для нескольких элементов

var animals = ["cats", "dogs", "chimps", "moose", "chimps"]

animals = animals.filter(){$0 != "chimps"}
print(animals) // ["cats", "dogs", "moose"]

Или, альтернативно

animals.index(of: "chimps").map { animals.remove(at: $0) }

Примечания

  • Вышеуказанные методы изменяют массив на месте (кроме filter) и возвращают удаленный элемент.
  • Swift Руководство по фильтру карты Уменьшить
  • Если вы не хотите изменять исходный массив, вы можете использовать dropFirst или dropLast для создания нового массива.

Обновлено до Swift 3

121
ответ дан Suragch 25 August 2018 в 00:21
поделиться

Для Swift4:

list = list.filter{$0 != "your Value"}
7
ответ дан user 25 August 2018 в 00:21
поделиться
Расширение

для удаления объекта String

extension Array {
    mutating func delete(element: String) {
        self = self.filter() { $0 as! String != element }
    }
}
0
ответ дан Varun Naharia 25 August 2018 в 00:21
поделиться

Мало Операция относится к массиву в Swift

Create Array

var stringArray = ["One", "Two", "Three", "Four"]

Добавить объект в массив

stringArray = stringArray + ["Five"]

Получить значение из объекта Index

let x = stringArray[1]

Append Object

stringArray.append("At last position")

Вставить объект в индекс

stringArray.insert("Going", atIndex: 1)

Удалить объект

stringArray.removeAtIndex(3)

Значение Concat Object

var string = "Concate Two object of Array \(stringArray[1]) + \(stringArray[2])"
11
ответ дан zellio 25 August 2018 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: