我正在使用外部服务,从那里可以获得组织的所有员工详细信息,如下所示。我正在使用java8和spring cloud伪装客户端来使用服务
[
{
"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多个员工详细信息。
我需要创建另外两个服务
目前我正在使用的分类服务如下所示
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))的东西
任何人都可以告诉我当前使用的方法有什么问题吗?有什么方法可以使我以其他任何方式或即兴发挥作用
答案 0 :(得分:4)
我可以想到的一件事是,您肯定可以即兴创作,两次调用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)
。
将其与访问,插入和删除之类的操作进行进一步比较也不等同。由于执行的操作也不同。