对不包含元素的数组进行排序

时间:2018-06-28 09:41:23

标签: ios arrays swift sorting

我在表视图中显示了一个自定义类型的元素数组。 每个元素都有属性,尤其是一个“级别”的元素(以Int为0、1、2或3)

我想做什么:
我想按级别对这些元素进行排序,但只在表视图的顶部显示级别3的元素,而忽略级别<3的其他元素。

我尝试过的事情
-self.elements.sort(by: { $0.level! > $1.level! })
=>所有事件均已排序

-if element.level! > 2 { self.elements.sort(by: { $0.level! > $1.level! }) }
=>无法正常工作



我真的不知道该怎么办...知道吗?
谢谢!

编辑
对不起,我可能不太清楚:
我有一个元素数组,我首先按与用户的距离排序,然后只希望第3级元素位于表格视图的顶部。 理想情况下,我希望这些3级元素也可以按距离排序。
->我想要的输出:按距离排序的元素,顶部为3级元素,我也希望按距离对这些3级元素进行排序

(抱歉,英语不是我的母语)

5 个答案:

答案 0 :(得分:0)

尝试这个

self.elements.sort(by: { $0.level! > $1.level! }) 

var newArr = self.elements.filter({$0.level > 2})

答案 1 :(得分:0)

当您不得不处理这种可能反复发生且非常具体的操作时,建议您创建可重复使用的扩展。

有一个例子:

  

您的CustomClass(仅用于示例)

class CustomClass {
    var text: String!
    var level: Int!

    convenience init(text: String, level: Int) {
        self.init()

        self.text = text
        self.level = level
    }
}
  

一个扩展方法模型(可以再次使用并进行修改)

extension Array where Element:CustomClass {
    mutating func sortWithFilter(minLevel: Int) {
        let list = self.sorted(by: { $0.level > $1.level})

        self = list.filter( { $0.level > minLevel })
    }
}
  

用法:

// Create array with your CustomClass

var array = [CustomClass]()

// Add some data

array.append(CustomClass(text: "info1", level: 1))
array.append(CustomClass(text: "info2", level: 3))
array.append(CustomClass(text: "info3", level: 2))
array.append(CustomClass(text: "info4", level: 3))
array.append(CustomClass(text: "info5", level: 0))

// Use our new extension method

array.sortWithFilter(minLevel: 2)
  

输出:

text : info2 , level : 3 
text : info4 , level : 3

我希望这会有所帮助:)

答案 2 :(得分:0)

根据您的问题,您只需要显示3级对象,然后就无需对其进行排序,只需按以下所示过滤它们并完成即可。因为您只显示3级空白,其他对象将忽略

elements.filter({$0.level == 3})

答案 3 :(得分:0)

我设法通过将3级元素添加到另一个数组来实现这一点。然后,我按距离对两个数组进行排序,最后将它们组合在一起以在表视图中显示元素。

谢谢您的帮助!

答案 4 :(得分:0)

假设我们具有以下结构...

struct SomeStruct: CustomStringConvertible {
    var level: Int
    // create a random distance for demonstration
    let distance = Double(arc4random_uniform(100))

    var description: String {
        return "Level: \(level), Distance: \(distance)"
    }
}

还有这些结构的数组...

var arrayOfStructs = [
    SomeStruct(level: 3),
    SomeStruct(level: 1),
    SomeStruct(level: 1),
    SomeStruct(level: 2),
    SomeStruct(level: 1),
    SomeStruct(level: 3),
    SomeStruct(level: 3),
    SomeStruct(level: 2),
]

您可以使用以下条件对此数组进行排序:

arrayOfStructs.sort {
   ($0.level == 3 || $1.level == 3 && $0.level != $1.level) ? ($0.level == 3) : ($0.distance < $1.distance)
}

然后arrayOfStructs.forEach { print($0) }得到以下结果:

Level: 3, Distance: 38.0
Level: 3, Distance: 60.0
Level: 3, Distance: 75.0
Level: 1, Distance: 15.0
Level: 2, Distance: 23.0
Level: 2, Distance: 52.0
Level: 1, Distance: 65.0
Level: 1, Distance: 78.0