Всем привет) Уже второй день бьюсь над простым, казалось бы, вопросом.
Есть ArrayList, в котором лежат объекты типа: "Вася, 30 лет, холост"; "Марина, 25 лет, в разводе".
Как сделать так, чтобы если с консоли вводишь "холост", выводился "Вася"? То есть, я не понимаю, как сделать выборку объекта по значению поля.
Comparator, насколько я поняла, отсортирует всю коллекцию, но там нужно передавать в параметры объекты, а не строку.
Подскажите, пожалуйста, куда смотреть((
hidden #2444690
26 уровень
Как сделать пользовательскую сортировку по полям объекта?
Решен
Комментарии (21)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia Volkova Java Developer в DXC Master
21 января 2021, 21:06решение
С помощью stream и filter можно.
+2
hidden #2444690
21 января 2021, 21:07
Спасибочки)) Ушла смотреть)
0
hidden #2444690
21 января 2021, 22:02
Отлично работает) Благодарю))
0
hidden #2322530
21 января 2021, 22:14
ещё с помощью компаратор можно , фильтр в стримах по сути делает тоже самое
+1
hidden #2444690
21 января 2021, 22:29
Вот я не догнала, как это сделать, если честно, а стрим как-то легко и быстро работает, хотя про лямбды вообще ничего не знаю. Если нетрудно, объясни, пожалуйста, как загнать строку для сравнения в компаратор. Если время будет, конечно) Я вчера весь мозг себе сломала, как объект на строку заменить) И примеров готовых нигде не нашла.
0
Стас Пасинков Software Developer в Zipy Master
22 января 2021, 01:54полезный
когда вы пишете класс, и хотите, чтобы объекты вашего класса можно было бы закинуть в какой-нибудь Collections.sort() и они там сами рассортировались как вам надо - для этого ваш класс должен имплементить интерфейс Comparable. в нем не так уж и много методов, которые надо будет дополнительно реализовать, аж один: compareTo()
он принимает какой-то другой объект вашего же класса. и внутри него вам надо реализовать как джава должна будет сравнить текущий объект (this) и тот другой объект, который придет в метод. для того, чтобы дать джаве понять, что какой-то объект "меньше", а какой-то другой - "больше", для этого метод этот и возвращает какое-то целое число (инт)
если this объект "меньше" того другого объекта - метод должен вернуть -1
если this объект "равен" тому другому объекту - тогда надо вернуть 0
ну и если this объект "больше" другого объект - возвращайте 1.
там есть еще несколько правил/ограничений, которые описаны в документации... при простых алгоритмах сравнения они и так будут соблюдены, но если что-то сложное там пишете - постарайтесь чтобы ваш алгоритм сравнения соответствовал бы тем требованиям
реализовав этот метод один раз - все объекты вашего класса будут уметь сравнивать себя с другими такими объектами, и поэтому стандартные средства сортировок заработают :)
+1
Стас Пасинков Software Developer в Zipy Master
22 января 2021, 02:02полезный
еще бывает так, что у какого-то класса уже реализован этот метод и там написан алгоритм какого-то сравнения... но вам он не подходит, и вы бы хотели сравнить эти объекты по-другому... для этого используется компаратор. это как бы "кастомный" алгоритм сравнения, который вы можете передать в метод сортировки, и он вам отсортирует не тем "дефолтным" алгоритмом, а вот именно вашим. для этого там принцип похожий, надо просто реализовать метод сравнения двух объектов, который будет возвращать -1, 0 или 1 чтобы джава понимала на какое место ставить какой-то объект при сортировке.
я в статье про лямбды там несколько примеров компараторов приводил
+1
hidden #2444690
22 января 2021, 05:52
Спасибо большое за ссылку) С лямбдами после работы уже буду разбираться) С компаратором до меня не доходила простая вещь, что для сравнения мне нужно передавать не чистый объект, а object.toString(), и тогда все находится, как здесь в стримах
Хотя contains не лучший вариант, конечно, лучше через что-то другое делать 0
Ksenia Volkova Java Developer в DXC Master
22 января 2021, 08:28
Лучше все же фильтр по полю объекта делать, а не через toString()
0
hidden #2444690
22 января 2021, 10:08
Хм, спасибо, посмотрю
0
hidden #2444690
22 января 2021, 10:26
Нет, лучше сразу спрошу) а как это поле обозначить? Если каждое поле отдельно прописывать, то ерунда получается. Может, этих полей сотня потом будет. Как его добыть, если не через строку? Через строку тоже, конечно, неправильно, может, у объекта вообще toString по нужному полю не будет или ещё что-нибудь... Куда копать?
0
Ksenia Volkova Java Developer в DXC Master
22 января 2021, 10:30
Для того, чтобы ответить на твой вопрос, нужно точно представлять задачу.
В чем ее суть? Нужно по строке находить объект, у которого любое из полей содержит эту строку? Или все-таки имеет значение, по какому полю мы ищем?
0
hidden #2444690
22 января 2021, 10:55
Любое из полей содержит строку. Я знаю только один способ. Например, object. status. equals("married"). Но тогда получается каждый раз нужно поле прописывать в методе сортировки. Для статуса одно условие, для возраста другое и так далее. А общий алгоритм только через object. toString () и фильтр поняла, как сделать.
0
Ksenia Volkova Java Developer в DXC Master
22 января 2021, 10:58
"Вася Пупкин, 30 лет, холост"; "Семен Холостов, 25 лет, женат" - поиск по "холост" должен обоих находить?
0
hidden #2322530
22 января 2021, 11:11
а делать объект со 100 полями не ерунда? ))
0
hidden #2444690
22 января 2021, 12:42
Да, обоих)
0
hidden #2444690
22 января 2021, 12:42
Не могу ответить на твой вопрос, не знаю)
0
Ksenia Volkova Java Developer в DXC Master
22 января 2021, 12:45полезный
Если будет 100 полей и все их надо будет включать в toString() - это сомнительный подход.
Лучше уж рефлексией их перебирать ))
+1
Стас Пасинков Software Developer в Zipy Master
22 января 2021, 13:32полезный
ну так вы же если не компаратор пишете, а просто в своем классе реализуете метод compareTo() - то один раз расписали логику на какие поля надо смотреть, на какие нет - и все.
кстати, у классов String, Integer и многих других уже реализован этот метод. так что если вас устраивает стандартная сортировка - вы в своем методе compareTo() можете вызывать уже готовые методы из других классов. это чтобы не все с нуля писать самому, а чтобы можно было использовать уже готовые методы. кстати, если вам надо обернуть стандартный порядок - можете просто результат вызова стандартного метода умножить на -1
в курсе джавараша там будет несколько задач на это все :)
+1
hidden #2444690
22 января 2021, 13:49
Спасибо) видимо, не доползла ещё, только "пляжи" были с compareTo)
0
hidden #2444690
22 января 2021, 13:50
Час от часу не легче) В общем, я поняла, что легко и просто не получится, оставлю, как рабочую версию через toString() пока) Спасибо)
0