Сортировка и фильтрация списка объектов - PullRequest
0 голосов
/ 27 октября 2018

У меня есть внешняя служба, откуда я получаю информацию о всех сотрудниках организации, как показано ниже.Я использую java8 и весеннее облако, симулирующее клиента для использования услуги

[
  {
    "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. Сортировка на основе city и houseNumber и возврат всех сотрудников
  2. Служба фильтрации сотрудников на основе определенных атрибутов, таких как 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)) для получения результата

Может кто-нибудь сказать мне, в чем проблема с текущим подходом, который я использую, и есть ли способ, которым я могу импровизировать любым другим способом или подходом

1 Ответ

0 голосов
/ 27 октября 2018

Одна вещь, о которой я могу подумать, что вы, безусловно, можете импровизировать, это вызов 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());

Но, как уже отмечали оба Хольгер и Дж. Б. Низет , ни одно из них не снижает сложности, скажем,O(nlogn) до O(1), как вы ожидаете.

Сравнение его с такими операциями, как доступ, вставка и удаление, также не эквивалентно.Поскольку выполняемые операции также различны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...