java - 排序和过滤对象列表

标签 java sorting collections java-8 time-complexity

我有一个外部服务,从那里我可以获取组织的所有员工详细信息,如下所示。我正在使用 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 多个员工详细信息。

我需要创建另外两个服务

  1. 根据城市houseNumber排序并返回所有员工
  2. 根据城市bandempId 等特定属性过滤员工的服务。

目前我使用的排序服务如下图所示

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());

但是,正如 HolgerJB Nizet 已经指出的那样,这些都没有将复杂度从 O(nlogn) 降低到 O(1),因为您重新期待。

进一步将其与访问、插入和删除等操作进行比较也不等同。由于执行的操作也不同。

关于java - 排序和过滤对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53021649/

相关文章:

collections - Go 中是否存在 Set? (就像在 Python 中一样)

java - hashcode() 的正确实现

Java:从缓冲图像中获取 RGBA 作为整数数组

java - 初始化后对象为空

java - 如果配置加载失败如何停止部署

javascript - 我不明白为什么数字排序函数在 Javascript 中有效

algorithm - Big(O) 符号 - 哪个是正确的

string - 基数排序字符串

java - 为什么 containsAll 在第二种情况下确实返回 true

Java 迭代器 nextIndex 指针