在我的例子中只有一个数组元素要排序

时间:2017-09-11 10:59:22

标签: ios swift swift3

我有一个字符串列表:

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“橙色”始终是第一个项目,现在该怎么做?

5 个答案:

答案 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。