java - 排序和过滤对象列表
问题描述
我有一个外部服务,我可以从中获取组织的所有员工详细信息,如下所示。我正在使用 java8 和 spring cloud feign 客户端来使用该服务
[
{
"employee": {
"empId": "empId123",
"name": "Emp1",
"houseNumber": "5",
"firstName": "firstName1",
"lastName": "lastName1",
"city": "city1",
"band": "A"
},
"type": "ABC"
},
{
"employee": {
"empId": "empId456",
"name": "Emp2",
"houseNumber": "7",
"firstName": "firstName2",
"lastName": "lastName2",
"city": "city2",
"band": "B"
},
"type": "ABC"
}
:
:
]
员工详细信息服务有大约 10000 多个员工详细信息。
我需要创建另外两个服务
- 根据城市和门牌号排序并返回所有员工
- 基于某些属性(如city、band、empId等)过滤员工的服务。
目前我正在使用的排序服务如下所示
final List<Employees> employeesList = employeeService.getAllEmployees().stream()
.sorted((emp1, emp2) -> p1.getAddress().getCity().compareTo(emp2.getAddress().getCity()))
.sorted((emp1, emp2) -> p1.getAddress().getHouseNumber().compareTo(emp2.getAddress().getHouseNumber()))
.collect(Collectors.toList());
对于过滤我使用下面的代码
String cityName = "some city name"...
final List<Employees> employeesfilteredList = employeeService.getAllEmployees()
.stream()
.filter(employee -> employee.getAddress().getCity().equalsIgnoreCase(cityName == null ? "" : cityName))
.collect(Collectors.toList());
但是我的技术人员客户说这有性能问题,并要求带来一些时间复杂度较低的东西(最好是O(1))来带来结果
谁能告诉我我正在使用的当前方法有什么问题,有什么方法可以让我以任何其他方式或方法即兴发挥吗
解决方案
我能想到的你当然可以即兴创作的一件事是调用sorted
两次,只能调用一次:
// replacing with 'employees' for 'employeeService.getAllEmployees()'
Comparator<Employees> compareBasedOnCity =
Comparator.comparing(emp -> emp.getAddress().getCity());
Comparator<Employees> compareBasedOnHouse =
Comparator.comparing(emp -> emp.getAddress().getHouseNumber());
employees.sort(compareBasedOnCity.thenComparing(compareBasedOnHouse));
另一个在过滤器期间是避免将null
和""
字符串视为相同:
List<Employees> finalList = employees.stream()
.filter(employee -> employee.getAddress().getCity().equalsIgnoreCase(cityName))
// don't consider empty city name same as null (think of " " otherwise)
.collect(Collectors.toList());
但是,正如Holger和JB Nizet已经指出的那样,这一切都O(nlogn)
不会降低O(1)
您所期望的复杂性。
进一步将其与访问、插入和删除等操作进行比较也不等同。由于执行的操作也不同。
推荐阅读
- twilio-api - Twilio 代理会议
- firebase - Firebase实时数据库-如果值为null,则读取路径时权限被拒绝
- eclipse - 是否可以在工作台启动时运行 Eclipse 构建器?
- python - 在python中转换为阿拉伯语文本
- mysql - 同时向两个表中插入相同的多条数据
- javascript - 更改事件后未调用函数
- ionic-framework - IONIC 4 为离子组件添加 css 属性
- jsp - Webpack 4 - 更新 JSP 文件时 devServer 不会自动重新加载
- formatting - 如何在 Jupyter 笔记本数学模式中将数字右对齐
- python - 合并具有不同索引的两个数据帧,同时使用一行代码保留主数据帧的索引