【问题标题】:Swift iOS - Filter array into array of array like objectsSwift iOS - 将数组过滤成类似对象的数组数组
【发布时间】:2016-04-18 23:56:58
【问题描述】:

j我有一个带有子对象的对象数组。

我想根据子对象将我的数组排序为数组数组

例如:数组

[employee, employee, employee, employee]

现在我想做的就是这样排序 ->

[[employee.job.jobName = "baker",employee.job.jobName = "baker"],
[employee.job.jobName = "sweeper",employee.job.jobName = "sweeper"]]

目标是创建一个表格视图,其中部分标题将员工分组,他们的 job.jobName 相同。并且行将由这些员工、他们的姓名等组成。为了做到这一点,我需要一组独特的 job.jobNames 用于组成部分计数的员工,然后每个部分中的员工数组组成行数。

我尝试过使用 array.map 和 array.filter,但我认为我需要一个组合,我似乎无法解决这个问题。任何帮助将不胜感激!

【问题讨论】:

  • 您可以使用let sortedArray = yourArray.sort{$0.job < $1.job}filter{$0.job == "baker"}对其进行排序
  • 谢谢,我可以对其进行排序,但我需要让具有独特工作的员工,将它们放入数组中,然后将这些数组放入数组中。那能做到这一点吗?我可以以某种方式使用嵌套排序吗?
  • 使用员工类别声明和预期结果编辑您的问题
  • 对象很大,有很多属性。我可以这样做,但它可能只会带走所发布的主要思想。一个带有工作子对象的员工对象,其中我有一个员工对象数组,这些对象需要排序到一个数组数组中,其中员工的 job.jobName 都是相同的。我看到我遗漏了那份工作不是一个字符串。我会补充的。
  • 这里的目标是按job 对这些employee 对象进行分组吗?如果是这样,每个数组中员工的顺序或具有相同工作的员工数组的顺序是否重要?

标签: ios swift sorting multidimensional-array filter


【解决方案1】:
import UIKit

/*Data Structure for Employee*/
class Employee:NSObject{
    /*Unemployed for default*/
    var job:String = "unemployed"

    init(job:String){
        self.job = job
    }

    override var description: String {
       return self.job
    }
}



/**Returns the array of arrays of enmployees sorted by jobs*/
func sortEmployees(employees:[Employee])->[[Employee]]
{
    //Sorting them by job
    let sorted = employees.sort({$0.job < $1.job})

    //Empty array of arrays
    var sortedEmployees = [[Employee]]()

    //job key
    var currentKey = ""
    for emp in sorted{
        let tempKey = emp.job
        //first element - edge case
        if sortedEmployees.count == 0
        {
            currentKey = tempKey
            sortedEmployees.append([emp])
        }
        else{
            if tempKey != currentKey{
                //create a new object
                sortedEmployees.append([emp])
                currentKey = tempKey
            }
            else{
                //get last array
                if let  lastArray = sortedEmployees.last{

                    var tempLast = lastArray
                    tempLast.append(emp)
                    sortedEmployees.removeLast()

                    sortedEmployees.append(tempLast)
                }
            }
        }
    }

    print(sortedEmployees)
    return sortedEmployees
}


/**Sample iVars*/
let emp1 = Employee(job: "baker")
let emp2 = Employee(job: "baker")
let emp3 = Employee(job: "sweeper")
let emp4 = Employee(job: "sweeper")


//Array with all of them
let array = [emp1, emp2, emp3, emp4]


let result = sortEmployees(array)
print(result)

【讨论】:

  • 这就是我的想象。很好的答案谢谢。我希望嵌套过滤器或地图有更简单的方法,也许有,但非常感谢!
  • 可能有,但我不知道。我将代码重构为一种更易于使用的方法。随时。
  • @JanuszChudzynski 为什么不简单地 override var description: String { return job }
【解决方案2】:

以下是我对如何将员工数组拆分为数组数组的看法。

// Just needed to make the example work
struct Job {
    var name: String
}

struct Employee {
    var job: Job
}
/////////////////////////////////////////

let employees = [Employee(job: Job(name: "baker")), Employee(job: Job(name: "sweeper")), Employee(job: Job(name: "baker")), Employee(job: Job(name: "sweeper"))]

var jobs = Set<String>()

employees.forEach { jobs.insert($0.job.name) }

let sortedJobs = jobs.sort()

var groupedEmployees = [[Employee]]()
for jobName in sortedJobs {
    groupedEmployees.append(employees.filter({ $0.job.name == jobName }))
}

print(groupedEmployees)

它产生所需的输出:

[[main.Employee(job: main.Job(name: "baker")), main.Employee(job: main.Job(name: "baker"))], [main.Employee(job: main.Job(name: "sweeper")), main.Employee(job: main.Job(name: "sweeper"))]]

【讨论】:

  • 这是我最初想做的。另一个答案也是正确的,但这使用过滤器和排序来完成任务。谢谢比尔兹利
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 2019-09-20
相关资源
最近更新 更多