如何在最后一个索引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
对象而不是String
s。你的数组是怎么定义的?
正如@jpetric 在对他的回答的评论中所说,您应该考虑使用 Swift 数组而不是 NSMutableArray
。您将获得 filter
、map
和 sorted
方法以及其他好东西:)【参考方案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" < "None"
@MartinR,正确,“None”的实例将被移动,因为"None" < "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中添加元素的主要内容,如果未能解决你的问题,请参考以下文章