Тёмный

Функциональный интерфейс Comparator 

Oleksandr Tsymbaliuk
Подписаться 6 тыс.
Просмотров 2,6 тыс.
50% 1

Программу данного курса вы можете посмотреть по ссылке - docs.google.co...
Comparator - функциональный интерфейс появившийся в Java 8. Используется
для установления отношения полного порядка в множестве объектов в коллекции.
Основное предназначение сравнение двух объектов. Это используется для сортировки
последовательностей объектов, для поиска минимального и максимального элемента.
Ссылка на конспект этой лекции - drive.google.c...

Опубликовано:

 

23 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 38   
@данилкрюков-ю4в
@данилкрюков-ю4в 2 года назад
Очень качественная подача материала, спасибо!
@uvporq6434
@uvporq6434 4 месяца назад
Спасибо большое, очень понятно объясняете
@SvetlanaCapri
@SvetlanaCapri Год назад
Спасибо большое.
@manOfPlanetEarth
@manOfPlanetEarth 2 года назад
Ещё один хороший урок.
@manOfPlanetEarth
@manOfPlanetEarth 2 года назад
46:20 Я почти всегда делаю import static ... Это делает код намного читабельнее. Особенно это актуально для служебных классов вроде Collectors, который рассматривается в одной из дальнейших лекций. Другое. Function это фанкшэн, а не фанкшенал:) Predicat и Consumer вы не называете фанкшенал, вы называете их по названиям. И вижу, что стали функциональные интерфейсы называть func вместо fun - это хорошо, т.к. fun - это "веселье" по-английски. Странновато смотрелось:) ---- Всё забываю сказать: размер шрифта в презентации в видео норм, но вот код в ide мелковат:) Можно покрупнее показывать рабочую область. Предложение для дальнейших видео на любую тему:) А так здорово, что все закрыты все вспомогательные окна ide: для показываемых примеров они совершенно не нужны.
@TheRevivalSymphony
@TheRevivalSymphony Год назад
Вторая задача. Можно было реализовать таким образом? List numbers = Arrays.asList(5, 7, 12, -2, - 5, 3, -3, -1, 1); Comparator comparator = Comparator.comparingInt(Math::abs); Comparator comparator2 = Comparator.reverseOrder(); Integer min = Collections.min(numbers, comparator.thenComparing(comparator2) ); System.out.println(min);
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Год назад
Да такое решение вполне хорошее
@don_alberto
@don_alberto 3 года назад
гениально ! спасибо! я ваш кумир
@valentinaboiko6060
@valentinaboiko6060 8 месяцев назад
задача номер 4. может не самое элегантное исполнение, но работает public static boolean isPrime(Integer number){ if (number Integer.compare(a,b); int minOrMax = Collections.min(numbers,findMin); numbers.removeIf(n -> !isPrime(n)); if (numbers.isEmpty()) { System.out.println("no prime numbers. min in the collection is " + minOrMax); } else { minOrMax = Collections.max(numbers,findMax); System.out.println("max prime is " + minOrMax); }
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk 8 месяцев назад
Ну можно и так конечно :) Интересный подход
@TheRevivalSymphony
@TheRevivalSymphony Год назад
Задача 4. Правильно ли писать так? Достаточно сложная тема для понимания, был бы очень признателен за поправки public class HomeWorkFirth { public static void main(String[] args) { List numbers = Arrays.asList(3, 1, 2, 5, 7, 12, 16, 18, 22, 19, 34, 55, 23); Predicate predicate = HomeWorkFirth::isPrime; Comparator cmp = (o1, o2) -> sortNumbers(o1, o2, predicate); Collections.sort(numbers, cmp); System.out.println(numbers.get(numbers.size()-1)); } public static int sortNumbers(int o1, int o2, Predicate predicate) { if (predicate.test(o1) && predicate.test(o2)) { return Integer.compare(o1, o2); } else if (predicate.test(o1) && !predicate.test(o2)) { return 1; } else if (!predicate.test(o1) && predicate.test(o2)) { return -1; } else { return Comparator.reverseOrder().compare(o1, o2); } } public static boolean isPrime(int number) { if (number < 2) {return false;} if (number
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Год назад
Тут разве что метод определения простоты числа написан не очень удачно (но к задаче это имеет мало отношения), в остальном верно.
@valentinaboiko6060
@valentinaboiko6060 8 месяцев назад
задача номер 2. Работает List numbers = new ArrayList(List.of(9,-4,-3,5,4,-5,8,3)); Comparator minValue = (a,b) -> Integer.compare(Math.abs(a),Math.abs(b)); Comparator isPositive = (a,b) -> Integer.compare(b,a); int min = Collections.min(numbers,minValue.thenComparing(isPositive)); System.out.println(min);
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk 8 месяцев назад
Решение верное
@valeriigerasymovych3732
@valeriigerasymovych3732 3 года назад
Помоги пожалуйста разобраться в следующем: default
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk 3 года назад
Давайте разбирать сигнатуру этого метода 1)
@valeriigerasymovych3732
@valeriigerasymovych3732 3 года назад
@@oleksandrtsymbaliuk Спасибо.
@ДмитрийНазаров-е6у
От осознания того, что я это понимаю и могу объяснить принцип работы, становится страшновато 😁
@valentinaboiko6060
@valentinaboiko6060 8 месяцев назад
задача номер 3. работает public static Integer sumFirstLastDigits(int a){ Integer result; if (a>=0 && a < 10) return a; int firstDigit = 0; int lastDigit = a%10; while (a!=0){ firstDigit = a; a /= 10; } result = firstDigit + lastDigit; return result; } List numbers = new ArrayList(List.of(20003, 88, 1, 8, 2000)); Comparator orderBySumOfDigits = (a,b) -> Integer.compare(sumFirstLastDigits(a),sumFirstLastDigits(b)); Collections.sort(numbers,orderBySumOfDigits); for (Integer i : numbers){ System.out.println(i); }
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk 8 месяцев назад
Решение верное
@weetalic6167
@weetalic6167 3 года назад
Мене гріє факт, що я можу прочитати, що тут написано ∀ Y⊂X ∃a∈Y ∀ b∈Y : aRb, крім одного моменту, що за бісова "R"?
@weetalic6167
@weetalic6167 3 года назад
Все, знайшов. Це бінарне відношення
@Roman-s9w
@Roman-s9w Год назад
Чому не можна писати наприклад не private String name; private int age; а private( String name int age)
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Год назад
Тому що це суперечить синтаксису мови Java. Тобто такий код, як ви показали, просто не працюватиме.
@weetalic6167
@weetalic6167 3 года назад
на 1:49 говорите умову ∀ a , b∈X :aRb⊕bRa, коли на екрані умова ∀ a , b∈X :aRb∨bRa
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk 3 года назад
А условие антисимметричности озвученное выше(пункт 2) позволяет мне так говорить. Подробнее например тут - en.wikipedia.org/wiki/Total_order
@weetalic6167
@weetalic6167 3 года назад
​@@oleksandrtsymbaliuk Ви кажете все правильно, просто запис неправильний. Ви використали позначення диз'юнкції, замість виключної диз'юнкції. На 5:00 ви знову наголошуєте, що це саме виключна диз'юнкція.
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk 3 года назад
Нет использование ⊕ будет противоречить антисимметричности (т. е. пунк 2 станет невыполнимым в принципе) ну и как следствие вы не получите отношения полного порядка. Так, что в записи все также верно. Опять же это описано в материалах по ссылке что я приводил. Отношение полного порядка именно так и определяется.
@Roman-s9w
@Roman-s9w Год назад
public class Main { public static void main(String[] args) { Cat cat1 = new Cat("Umka", 12); Cat cat2 = new Cat("Luska", 5); Cat cat3 = new Cat("Barsic", 8); Cat cat4 = new Cat("Timka", 5); Cat cat5 = new Cat("Kuzia", 2); Cat[] cats = new Cat[] { cat1, cat2, cat3, cat4, cat5 }; for (Cat cat : cats) { System.out.println(cat); } System.out.println(); CatAgeComparator comp = new CatAgeComparator(); Arrays.sort(cats, comp); for (Cat cat : cats) { System.out.println(cat); } } } class CatAgeComparator implements Comparator { @Override public int compare(Cat o1, Cat o2) { if (o1.getAge() > o2.getAge()) { return 1; } if (o1.getAge() < o2.getAge()) { return -1; } return 0; } } Cat@7229724f Cat@4c873330 Cat@119d7047 Cat@776ec8df Cat@4eec7777 Cat@4eec7777 Cat@4c873330 Cat@776ec8df Cat@119d7047 Cat@7229724f чому таке видає
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Год назад
Тому що в класі Cat ви забули написати метод toString() ось і отримуєте результат за замовчуванням.
@Roman-s9w
@Roman-s9w Год назад
Пане Олексадре ви мені не відповіли чому
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Год назад
Відповів.
@Roman-s9w
@Roman-s9w Год назад
import java.util.Arrays; import java.util.Comparator; // Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`, // then press Enter. You can now see whitespace characters in your code. public class Main { public static void main(String[] args) { // Press Alt+Enter with your caret at the highlighted text to see how // IntelliJ IDEA suggests fixing it. Cat cat1 = new Cat("Umka", 12); Cat cat2 = new Cat("Luska", 8); Cat cat3 = new Cat("Barsic", 5); Cat cat4 = new Cat("Timka", 5); Cat cat5 = new Cat("Kuzia", 2); Cat[] cats = new Cat[]{cat1, cat2, cat3, cat4, cat5}; Comparator comp1 = (a, b) -> a.getAge() - b.getAge(); Comparator comp2 = Main:: CatAgeCompare; } public static int CatAgeCompare (Cat a, Cat b) { if (a.getAge() > b.getAge()) { return 1; } if (a.getAge() < b.getAge()){ return -1; } return 0; } } public class Cat { private String name; private int age; public Cat(String name, int age){ super(); this.name = name; this.age = age; } public Cat(){ super(); } public String getName(){ return name; } public void setName(String name) { this.name = name; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } } Process finished with exit code 0
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Год назад
Компаратори для віку реалізовано правильно.
@Roman-s9w
@Roman-s9w Год назад
public class Main { public static void main(String[] args) { // Press Alt+Enter with your caret at the highlighted text to see how // IntelliJ IDEA suggests fixing it. Integer[] array = new Integer[] { 5, 0, -3, 2, -1, 4}; Comparator comp = (a, b) -> Math.abs(a) - Math.abs(b); Arrays.sort(array, comp); System.out.println(Arrays.toString(array)); } } [0, -1, 2, -3, 4, 5] цей код працює
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Год назад
А це розв'язання якої задачі? Адже в завданні зазначено, що знайти елемент, а ви навіщось сортуєте масив.
@Roman-s9w
@Roman-s9w Год назад
public static void main(String[] args) { Cat cat1 = new Cat("Umka", 12); Cat cat2 = new Cat("Luska", 5); Cat cat3 = new Cat("Barsic", 8); Cat cat4 = new Cat("Timka", 5); Cat cat5 = new Cat("Kizia", 2); Cat[] cats = new Cat[]{cat1, cat2, cat3, cat4, cat5}; Comparator comp2 = Main::catAgeCompare; Comparator reversedComp = comp2.reversed(); Arrays.sort(cats, reversedComp); for (Cat cat : cats) { System.out.println(cat); } } public static int catAgeCompare(Cat a, Cat b ) { if (a.getAge() > b.getAge()) { return 1; } if (a.getAge() < b.getAge()){ return -1; } return 0; } } Cat@3b07d329 Cat@41629346 Cat@404b9385 Cat@6d311334 Cat@682a0b20
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Год назад
І тут знову немає методу toString() у класі Cat
Далее
Признавайтесь, кто его смыл?
00:54
Comparable и Comparator в Java
20:55
Просмотров 12 тыс.
ДИОГЕН Переоценка ценностей
3:45:48