【问题标题】:Sort array excluding elements对不包括元素的数组进行排序
【发布时间】:2018-06-28 09:41:23
【问题描述】:

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

我想做的事:
我想按它们的级别对这些元素进行排序,但只在表格视图的顶部显示级别 3 的元素,而忽略级别

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

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



我真的不知道该怎么办......有什么想法吗?
谢谢!

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

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

【问题讨论】:

  • 你需要filtersort的组合
  • 我不明白你的描述。如果你只想要第 3 级的元素,那就是过滤,那么排序是如何发挥作用的?请展示您的数据示例,以及您想要的输出示例。

标签: ios arrays swift sorting


【解决方案1】:

试试这个

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

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

【讨论】:

    【解决方案2】:

    当您必须处理此类可能反复出现且非常具体的操作时,我鼓励您创建可重用的扩展。

    有一个例子:

    您的 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
    

    希望对你有帮助:)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        感谢大家的帮助!

        【讨论】:

          【解决方案5】:

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

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-04-27
            • 1970-01-01
            • 2015-02-17
            • 2010-09-18
            • 2015-10-18
            • 2016-02-01
            • 2011-03-27
            相关资源
            最近更新 更多