面试题答案
一键面试实现思路
- 遍历所有订单,获取每个订单的客户等级和订单金额(订单金额通过遍历订单中的订单项,将每个订单项的价格乘以数量并累加得到)。
- 使用字典来存储不同等级客户的订单总金额,键为客户等级,值为对应等级客户订单总金额。在遍历订单过程中,若字典中已存在该客户等级的键,则将当前订单金额累加到对应的值上;若不存在,则在字典中新增该键值对。
- 最终返回存储不同等级客户订单总金额的字典。
代码实现(假设使用Objective - C语言)
#import <Foundation/Foundation.h>
@interface OrderItem : NSObject
@property (nonatomic, assign) double price;
@property (nonatomic, assign) NSInteger quantity;
@end
@implementation OrderItem
@end
@interface Customer : NSObject
@property (nonatomic, assign) NSInteger level;
@end
@implementation Customer
@end
@interface Order : NSObject
@property (nonatomic, strong) Customer *customer;
@property (nonatomic, strong) NSArray<OrderItem *> *orderItems;
@end
@implementation Order
@end
NSDictionary<NSNumber *, NSNumber *> *calculateTotalAmountByCustomerLevel(NSArray<Order *> *orders) {
NSMutableDictionary<NSNumber *, NSNumber *> *totalAmountByLevel = [NSMutableDictionary dictionary];
for (Order *order in orders) {
NSNumber *level = @(order.customer.level);
double orderTotal = 0;
for (OrderItem *item in order.orderItems) {
orderTotal += item.price * item.quantity;
}
if (totalAmountByLevel[level]) {
double currentTotal = [totalAmountByLevel[level] doubleValue];
totalAmountByLevel[level] = @(currentTotal + orderTotal);
} else {
totalAmountByLevel[level] = @(orderTotal);
}
}
return totalAmountByLevel;
}
你可以使用如下方式调用:
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 创建一些示例数据
OrderItem *item1 = [[OrderItem alloc] init];
item1.price = 10;
item1.quantity = 2;
OrderItem *item2 = [[OrderItem alloc] init];
item2.price = 20;
item2.quantity = 3;
Customer *customer1 = [[Customer alloc] init];
customer1.level = 1;
Order *order1 = [[Order alloc] init];
order1.customer = customer1;
order1.orderItems = @[item1, item2];
OrderItem *item3 = [[OrderItem alloc] init];
item3.price = 15;
item3.quantity = 4;
Customer *customer2 = [[Customer alloc] init];
customer2.level = 2;
Order *order2 = [[Order alloc] init];
order2.customer = customer2;
order2.orderItems = @[item3];
NSArray<Order *> *orders = @[order1, order2];
NSDictionary<NSNumber *, NSNumber *> *result = calculateTotalAmountByCustomerLevel(orders);
NSLog(@"%@", result);
}
return 0;
}
代码实现(假设使用Swift语言)
class OrderItem {
var price: Double
var quantity: Int
init(price: Double, quantity: Int) {
self.price = price
self.quantity = quantity
}
}
class Customer {
var level: Int
init(level: Int) {
self.level = level
}
}
class Order {
var customer: Customer
var orderItems: [OrderItem]
init(customer: Customer, orderItems: [OrderItem]) {
self.customer = customer
self.orderItems = orderItems
}
}
func calculateTotalAmountByCustomerLevel(orders: [Order]) -> [Int: Double] {
var totalAmountByLevel: [Int: Double] = [:]
for order in orders {
let level = order.customer.level
let orderTotal = order.orderItems.reduce(0) { $0 + ($1.price * Double($1.quantity)) }
if var currentTotal = totalAmountByLevel[level] {
currentTotal += orderTotal
totalAmountByLevel[level] = currentTotal
} else {
totalAmountByLevel[level] = orderTotal
}
}
return totalAmountByLevel
}
你可以使用如下方式调用:
let item1 = OrderItem(price: 10, quantity: 2)
let item2 = OrderItem(price: 20, quantity: 3)
let customer1 = Customer(level: 1)
let order1 = Order(customer: customer1, orderItems: [item1, item2])
let item3 = OrderItem(price: 15, quantity: 4)
let customer2 = Customer(level: 2)
let order2 = Order(customer: customer2, orderItems: [item3])
let orders = [order1, order2]
let result = calculateTotalAmountByCustomerLevel(orders: orders)
print(result)
以上代码分别用Objective - C和Swift实现了按照客户等级计算不同等级客户订单总金额的功能,由于题目强调KVC集合操作,但实际本题核心逻辑通过常规遍历即可完成,未过度依赖KVC集合操作特性。如果有对KVC集合操作的具体需求,请进一步明确。