我有一个字符串列表:
var nameList = ["Apple", "Watermelon", "orange", ...]
列表从后端返回,订单不保证。
我只希望orange
始终是数组中的第一个元素,不需要关心其他元素的顺序。
我尝试使用nameList.sort { $0 // what to do}
但是卡住了,因为我只想要一个元素作为第一个元素。
如何实现它?
======更新======
后续问题。如果我有一个水果对象列表,则每个fruit
都是一个自定义struct
对象:
struct Fruit {
public let name;
public let weight;
init(_ name: String, _ weight: Double) {
self.name = name
self.weight = weight
}
}
现在,我得到了Fruit
的列表:
var fruitList:[Fruit] = getDataFromBackend()
我希望fruit
name
“橙色”始终是第一个项目,现在该怎么做?
答案 0 :(得分:3)
您可以找到"orange"
的索引,并将其交换为第0个索引:
if let indexOfOrange = nameList.index(of: "orange") {
if indexOfOrange != 0 {
swap(&nameList[0], &nameList[indexOfOrange])
}
}
如果列表可以包含多个橙色,请改用此代码段:
let sorted = nameList.filter {$0 == "orange"} + nameList.filter {$0 != "orange"}
它将所有橙子的列表与所有非橙子的列表连接起来。
答案 1 :(得分:1)
dasblinkenlight's solution略有变化:移动“橙色” 元素(如果存在)到前面并保持顺序 剩下的要素:
var nameList = ["Apple", "Watermelon", "orange"]
if let idx = nameList.index(of: "orange"), idx != 0 {
nameList.insert(nameList.remove(at: idx), at: 0)
}
print(nameList) // ["orange", "Apple", "Watermelon"]
答案 2 :(得分:0)
好吧,如果其他元素的顺序无关紧要,你可以这样排序:
var nameList = ["Apple", "Watermelon", "orange"]
print(nameList.sorted(by: { first, _ in first == "orange" })) // ["orange", "Apple", "Watermelon"]
在这种情况下,我们将第一个元素设置为我们需要的("orange"
)并且不关心其他元素。
答案 3 :(得分:0)
我不知道它是否是您问题的完美解决方案,但您可以尝试使用它。它对我有用: -
let nameList : NSMutableArray = (["Apple", "Watermelon", "orange"] as NSArray).mutableCopy() as! NSMutableArray
if nameList.contains("orange") {
nameList.remove("orange")
nameList.insert("orange", at: 0)
}
答案 4 :(得分:0)
这是使用本机排序功能的一种非常简单的方法:
var fruitList = ["Apple", "Watermelon", "orange"]
let orangeFirst = fruitList.sorted{$1 != "orange"}
orangeFirst // ["orange", "Watermelon", "Apple"]
如果第一个参数在第二个参数之前,则传递给sorted()的函数应该返回true。所以任何不是“橙色”的值都应该在橙色之后。
请注意,如果我使用$ 0 ==“orange”,编译器会抱怨它需要一个双参数函数。通过使用$ 1,它可以理解隐含的$ 0和$ 1。