MST

星途 面试题库

面试题:Objective-C中KVC集合操作处理嵌套结构数据

现有一个公司类Company,公司类包含一个员工数组属性employees,员工类Employee有一个工资属性salary。公司类还有一个部门数组属性departments,每个部门类Department又有自己的员工数组。请通过KVC的集合操作计算出整个公司的员工平均工资,写出关键实现步骤及代码。
42.5万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

关键实现步骤:

  1. 获取公司所有员工的工资数组。这需要遍历公司的employees数组以及每个部门的employees数组,将所有员工的salary提取出来形成一个新数组。
  2. 使用KVC的集合操作计算平均工资。通过@avg操作符对工资数组进行计算。

代码实现(以Objective - C为例):

// 假设Company类定义如下
@interface Company : NSObject
@property (nonatomic, strong) NSArray<Employee *> *employees;
@property (nonatomic, strong) NSArray<Department *> *departments;
@end

// Employee类定义如下
@interface Employee : NSObject
@property (nonatomic, assign) float salary;
@end

// Department类定义如下
@interface Department : NSObject
@property (nonatomic, strong) NSArray<Employee *> *employees;
@end

@implementation Company
- (float)calculateAverageSalary {
    NSMutableArray *allSalaries = [NSMutableArray array];
    // 先添加公司直接的员工工资
    for (Employee *employee in self.employees) {
        [allSalaries addObject:@(employee.salary)];
    }
    // 再添加各部门员工工资
    for (Department *department in self.departments) {
        for (Employee *employee in department.employees) {
            [allSalaries addObject:@(employee.salary)];
        }
    }
    NSNumber *averageSalary = [allSalaries valueForKeyPath:@"@avg.self"];
    return averageSalary.floatValue;
}
@end

代码说明:

  1. 首先创建一个可变数组allSalaries来存储所有员工的工资。
  2. 通过嵌套循环,将公司直接管理的员工工资以及各部门员工工资添加到allSalaries数组中。
  3. 最后使用KVC的@avg操作符计算数组中所有工资的平均值,并返回该平均值。

如果是在Swift中实现:

class Employee {
    var salary: Float
    init(salary: Float) {
        self.salary = salary
    }
}

class Department {
    var employees: [Employee]
    init(employees: [Employee]) {
        self.employees = employees
    }
}

class Company {
    var employees: [Employee]
    var departments: [Department]
    init(employees: [Employee], departments: [Department]) {
        self.employees = employees
        self.departments = departments
    }
    
    func calculateAverageSalary() -> Float {
        var allSalaries: [Float] = []
        allSalaries.append(contentsOf: employees.map { $0.salary })
        for department in departments {
            allSalaries.append(contentsOf: department.employees.map { $0.salary })
        }
        let sum = allSalaries.reduce(0, +)
        return sum / Float(allSalaries.count)
    }
}

Swift代码说明:

  1. 在Swift中,首先定义了EmployeeDepartmentCompany类。
  2. Company类的calculateAverageSalary方法中,先通过map将公司直接员工和各部门员工的工资提取出来组成一个数组allSalaries
  3. 然后通过reduce计算工资总和,并除以员工总数得到平均工资。这里没有直接使用KVC,因为Swift有更简洁的方式来完成类似操作,如果一定要在Swift中使用KVC来计算平均值,需要使用NSArrayNSNumber桥接,如下:
func calculateAverageSalaryWithKVC() -> Float {
    var allSalaries: [NSNumber] = []
    allSalaries.append(contentsOf: employees.map { NSNumber(value: $0.salary) })
    for department in departments {
        allSalaries.append(contentsOf: department.employees.map { NSNumber(value: $0.salary) })
    }
    let averageSalary = (allSalaries as NSArray).value(forKeyPath: "@avg.self") as! NSNumber
    return averageSalary.floatValue
}

此方法先将Float类型的工资数组转换为NSNumber数组,然后使用KVC的@avg操作符计算平均值。