Remove the last occurrence of an element in a Swift array

烂漫一生 提交于 2019-12-24 04:29:13

问题


I need to remove the last occurrence of a specific element in a [Bool] Array. For example in JavaScript this would be:

var k = [true, true, false];
k.splice(k.lastIndexOf(true), 1);
==> [true, false]

How would I achieve the same behavior in Swift?


回答1:


You can easily find the last occurrence of a value by enumerating in reverse. When you find the value you're looking for, just remove it and break from the loop. Use reverse() enumerate the range of indexes in reverse order:

for i in array.indices.reversed() where array[i] == searchValue {
    array.remove(at: i)
    break
}



回答2:


Xcode 8.2 • Swift 3.0.2

var k = [true, true, true, false, true, false]

if let index = k.reversed().index(of: true) {
    k.remove(at: index.base - 1)
}

print(k)   // "[true, true, true, false, false]"

If you would like to create an extension to add this functionality to Array you need to constrain it to equatable elements:

extension Array where Element: Equatable {
    ///  Returns the last index where the specified value appears in the collection.
    ///  After using lastIndex(of:) to find the last position of a particular element in a collection, you can use it to access the element by subscripting.
    /// - Parameter element: The element to find the last Index
    func lastIndex(of element: Element) -> Index? {
        if let index = reversed().index(of: element) {
            return  index.base - 1
        }
        return nil
    }
    /// Removes the last occurrence where the specified value appears in the collection.
    /// - Returns: True if the last occurrence element was found and removed or false if not.
    /// - Parameter element: The element to remove the last occurrence.
    @discardableResult
    mutating func removeLastOccurrence(of element: Element) -> Bool {
        if let index = lastIndex(of: element) {
            remove(at: index)
            return true
        }
        return false
    }
}

Playground testing

var k = [true, true, true, false, true, false]

k.removeLastOccurrence(of: true)
print(k)                        // "[true, true, true, false, false]"



回答3:


I don't think there's a builtin function like lastIndexOf, so it's a bit more work.

var removeIndex: Int?

for (index, item) in enumerate(arr) {
    if item == search {
        removeIndex = index 
    }
}

if let removeIndex = removeIndex {
    arr.removeAtIndex(removeIndex)
}

Where arr is the array you're searching (k in your example) and search is what you're searching for (true in your example).



来源:https://stackoverflow.com/questions/31954061/remove-the-last-occurrence-of-an-element-in-a-swift-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!