如何在最后一个索引Swift中添加元素

Posted

技术标签:

【中文标题】如何在最后一个索引Swift中添加元素【英文标题】:How to add element at Last index Swift 【发布时间】:2016-12-15 07:43:48 【问题描述】:

我从服务器获取一个数组并将其存储在 NSMutableArray 中。现在的问题是数组没有排序。例如。数组 = ["A","B","无","C","D"]。我想对其进行排序并最后放置“无”元素。即 ["A","B","C","D","None"]。尝试交换但无法匹配条件,因为将来数组可能会增加。检查我下面的代码,它没有按预期工作。

if array.containsObject( "None" )
        print("\(array.indexOfObject("None"))")
        let noneIndex = array.indexOfObject("None")
        print(noneIndex)
        array.removeObject(noneIndex)
        print("Remove Array:-\(array)")
        array.insertObject(noneIndex, atIndex: (array.lastObject?.index)!)
        print("Sorted Array:-\(array)")
    

【问题讨论】:

您有什么理由不使用提供的sort()sorted() 方法? 你只需要array.addobject("None") 为什么是 NSMutableArray 而不是 Swift 数组 [String] 【参考方案1】:

也许我误解了您需要做什么,但如果您只想按字母顺序对数组进行排序,可以在数组上使用 sorted()

您还可以使用filter 从数组中删除“None”,对其进行排序,然后将“None”附加为最后一个元素

例如,如果你有

let elements = ["Alpha", "Bold", "None", "charlie", "Delta", "echo", "zebra", "k"]

你可以从过滤它开始:

let filteredElements = elements.filter  $0.uppercased() != "NONE"

对过滤后的元素进行排序:

var sortedElements = filteredElements.sorted  $0.uppercased() < $1.uppercased()

追加“无”

sortedElements.append("None") // ["Alpha", "Bold", "charlie", "Delta", "echo", "k", "zebra", "None"]

然后就完成了。

这里合并了:

let lastElement = "None"
let elements = ["Alpha", "Bold", "None", "charlie", "Delta", "echo", "zebra", "k"]
var sortedElements = elements.filter($0.uppercased() != lastElement.uppercased()).sorted(by: $0.uppercased() < $1.uppercased())
sortedElements.append(lastElement)

希望对你有所帮助。

【讨论】:

它不仅仅是字母,它可以是任何东西,比如单词,。条件是“无”应该是最后一次。 @iDeveloper,在sorted 闭包中添加使"None" 始终具有最大值的条件。 @pbodsk 这不起作用,它说,'Elememt'(又名'AnyObject')类型的值没有成员'大写' 嗯,好的,那一定是因为您的数组被定义为包含AnyObject 对象而不是Strings。你的数组是怎么定义的? 正如@jpetric 在对他的回答的评论中所说,您应该考虑使用 Swift 数组而不是 NSMutableArray。您将获得 filtermapsorted 方法以及其他好东西:)【参考方案2】:
var array = ["A", "B", "None", "C", "D"]
if let noneIndex = array.index(of: "None") 
    array.remove(at: noneIndex)
    array.append("None")

print(array)

【讨论】:

请注意,如果您写if let noneIndex = array.indexOf("None") ,则不需要检查if array.contains()【参考方案3】:

这应该将None 移动到数组的末尾,并对其他元素进行排序:

let ["A", "B", "None", "C", "D"]
array.sorted  $1 == "None" || $0 < $1  // ["A", "B", "C", "D", "None"]

这只是利用了by 参数的好处,该参数可以从Array 传递给sort/sorted 方法。

编辑 @MartinR 对此答案的比较谓词有一个非常强的观点,它确实没有提供strong weak ordering。使用正确的谓词对数组进行排序将遵循以下原则:

array.sorted  $0 == "None" ? false : $1 == "None" ? true : $0 < $1 

【讨论】:

@MartinR 感谢您的观察,更正了代码 这可能有效,但现在比较器不是所需的“严格弱排序”:"None" &lt; "None" @MartinR,正确,“None”的实例将被移动,因为"None" &lt; "None".我们可以迂腐地解决这个问题,我们获得了一点速度,但代价是增加了闭包的复杂性。 我不认为这是不必要的迂腐。 sorted 方法需要严格的弱排序。如果不满足该先决条件,则行为未定义。 @MartinR,嗯...我错过了 API 文档中的 strict weak ordering 部分,感谢您提出这个问题。我更新了答案,希望现在是正确的:)【参考方案4】:

这将起作用:

// starting test array
let array = ["B", "None", "C","P","None","A", "Q"]
var sorted = array.sorted  (str1, str2) -> Bool in
    return str1 < str2


sorted.forEach  str in
    if str == "None" 
        if let idx = sorted.index(of: str) 
            sorted.remove(at: idx)
            sorted.append(str)
        
    


// Sorted array is now ["A", "B", "C", "P", "Q", "None", "None"]

【讨论】:

我建议使用 Swift 的数组。从长远来看会更好。 Sorted 在 swit 3 中不可用。 你确定?因为我在 Playground 中使用 Swift 3 尝试了该示例。如果您在 Playground 中复制整个示例,它应该可以工作。 XCode 8.1 Swift 3 swift 3中应该有array.sorted方法。

以上是关于如何在最后一个索引Swift中添加元素的主要内容,如果未能解决你的问题,请参考以下文章

Python列表操作

js数组元素怎样删除最后一个元素

除了最后一个元素之后,如何在 #each 循环中的元素之间添加分隔符?

如何删除一个list中最后一个元素

如何删除添加到列表中的最后一个元素?

Swift--Array 详解