AlexOreshkevich / M-JC1-83-21

GNU General Public License v3.0
2 stars 5 forks source link

HomeTask 13 - Custom Collector #199

Open AlexOreshkevich opened 3 years ago

AlexOreshkevich commented 3 years ago

Создайте класс Person с полями name, surname, age.

Сгенерируйте группу из 100 рандомных человек в возрасте от 15 до 30.

Для генерации фамилий используйте список нашей группы плюс не менее 5 других фамилий, напр Петров, Сидоров и тд

Напишите ОДНУ НЕПРЕРЫВНУЮ цепочку stream вызовов (pipeline), которая: 1) выбирает объекты, возраст которых меньше 21, и у которых в фамилии встречаются хотя бы 2 буквы, которые есть в вашей фамилии; 2) распечатывает их на экран; 3) сортирует по фамилии, а потом по имени (использоватьthenComparing у объекта Comparator); 4) берет 4 первых объекта; 5) формирует коллекцию из фамилий объектов; 6) агрегирует все в коллекцию ImmutableSet.

Поместите ваш код в функцию в классе и напишите юнит тест, который демонстрирует корректность работы вашей функции.

Tip: для реализации пункта 6 вам нужно будет создать свой коллектор ImmutableSetCollector как показано в примере https://www.baeldung.com/java-8-collectors#Custom

Tip: для корректной работы коллекций типа Set нужно реализовать функции equals() и hashCode() в классе Person.

AlexOreshkevich commented 3 years ago

Tip: use https://www.geeksforgeeks.org/sets-intersection-function-guava-java/ in order to find surnames with 2 or more letters that match what your surname contains.

You can use the following code snippet as well:

  1. Transform your surname as a String into the set of characters:

    Set<Character> letters = new HashSet<>();
    char[] chars = mySurname.toCharArray();
    for (char c : chars) {
      letters.add(c);
    }
  2. When you will filter on other surname, calculate amount of matches:

    surname -> {
          char[] currentChars = surname.toCharArray();
          int numberOfMatches = 0;
          for (char letter : currentChars) {
            if (letters.contains(letter)) {
              numberOfMatches++;
            }
          }
          return numberOfMatches >= 2;
        }
dyskop commented 3 years ago

Есть вопрос по пункту 2. Это возможно сделать в непрерывной цепочке? Я не вижу способов, кроме как использовать forEach, но это терминальная операция, которая прерывает pipeline.