539 / 1227 / 37
Регистрация: 08.01.2017
Сообщений: 6,021
|
|
1 | |
Метод сравнения объектов пользовательского класса02.08.2020, 16:48. Показов 6443. Ответов 27
Метки нет (Все метки)
Нужно написать метод сравнения достаточно сложных объектов пользовательского класса - для сортировки массива этих объектов.
Вижу, что есть два интерфейса: IComparable и IComparer А может и ещё что-то есть (не знаю). Какой из них использовать? P.S.1. Не знаю важно это или нет, но сообщаю - эти объекты с рекурсией, то бишь, содержат в себе вложенные объекты того же типа (точнее - массив таких объектов). P.S.2. Можно, конечно, вообще никакие интерфейсы не притягивать, но захотелось сделать правильно - задача-то стандартная и значит вроде нужно обозначить использование стандартного интерфейса))) Какого? Добавлено через 12 минут P.S.3. А тут ваще не получится "зацикливания"? Есть массив объектов. Каждый элемент массива тоже содержит массив объектов этого типа (возможно и нулевой длины). Чтобы отсортировать массив, нужно иметь метод сравнения элементов. Но чтобы сравнивать элементы массива - объекты - нужно ведь уметь сортировать массив объектов, вложенный в каждый элемент массива (объект) ???)))
0
|
02.08.2020, 16:48 | |
Ответы с готовыми решениями:
27
Программа, использующая массив объектов пользовательского класса Во всех классах реализовать интерфейс IComparable и перегрузить метод CompareTo для сравнения объектов Для массива объектов класса «Студент» создать метод сортировки по различным критериям Задать метод события для множества объектов одного класса |
1842 / 1184 / 501
Регистрация: 14.10.2018
Сообщений: 3,180
|
|
02.08.2020, 16:51 | 2 |
Не по теме: Очередная тема без конкретного примера? Причем тут сортировка и рекурсия? Сравнение 2-ух объектов происходит по какому то конкретному значению / полю / свойству. Ну реализуйте метод CompareTo , проблема в чем?Ну реализуйте метод Compare , проблема в чем?Есть базовый метод, производный от object называет Equals Если еще перегруженный оператор == и ему подобныеЛюбой Нет такого понятия, есть факты
0
|
539 / 1227 / 37
Регистрация: 08.01.2017
Сообщений: 6,021
|
||||||
02.08.2020, 17:24 [ТС] | 3 | |||||
ОК, давайте рассмотрим такой пример.
Допустим, что речь о сортировке массива объектов вот такого класса: Кликните здесь для просмотра всего текста
P.S. Порядок элементов в массиве Mats каждого объекта не важен с точки зрения сравнения. Эти массивы не упорядоченные. Важен только набор элементов. Добавлено через 4 минуты Раз есть два интерфейса и соответственно два метода, то вероятно, они отличаются чем-то. По каким критериям выбирать что использовать? А других аналогичных интерфейсов нет? Может выбор ещё шире? Добавлено через 10 минут Пардон, я
0
|
02.08.2020, 18:19 | 4 |
IComparable - это вы учите объект сравнивать самого себя с другим объектом этого класса. Этот метод будет использоваться, если при сортировке вы не укажете явно компаратор. Соответственно IComparer - обычно реализуют у отдельного класса (компаратора), экземпляр которого передается в методы сортировки
1
|
539 / 1227 / 37
Регистрация: 08.01.2017
Сообщений: 6,021
|
|
02.08.2020, 20:24 [ТС] | 5 |
И всё-таки не понимаю по документации что и как. Ну их к чёрту. Сделаю без интерфейсов свои собственные методы.
0
|
02.08.2020, 20:47 | 6 | |||||
Сообщение было отмечено titan4ik как решение
Решение
Вот простенький пример.
1
|
539 / 1227 / 37
Регистрация: 08.01.2017
Сообщений: 6,021
|
|
02.08.2020, 23:07 [ТС] | 7 |
Спасибо, Toros1992, кое о чем стал хоть догадываться.
P.S. Жаль, что документацию пишут нечеловеческим языком (точнее - её пишут для тех, кто и так всё знает уже, многое остается между строк). Добавлено через 1 час 19 минут подброшу ещё одну старую ссылку до кучи ("замутим для ясности"): https://habr.com/ru/post/137680/
0
|
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
|
|
02.08.2020, 23:11 | 8 |
Книги можно почитать. Например, у Троелсена основные интерфейсы достаточно подробно разжеваны и с примерами.
1
|
539 / 1227 / 37
Регистрация: 08.01.2017
Сообщений: 6,021
|
|
03.08.2020, 00:32 [ТС] | 9 |
Цикл статей о сравнении объектов
Ссылка на первую статью https://habr.com/ru/post/314328/ Добавлено через 47 минут Почитал первые две статьи этого цикла... ёшкин кот... Интересно, в с++ такая же лабуда или там всё немного корректнее и однозначнее?) Добавлено через 30 минут QuakerRUS, спасибо. Мне понравилось. Надо бы потом полностью его прочитать - понравился подход к изложению материала. Сразу видно, что в голове у автора порядок (и реально глубоко просекает тему). Вроде и переводчик не налажал.
0
|
539 / 1227 / 37
Регистрация: 08.01.2017
Сообщений: 6,021
|
|
04.08.2020, 16:47 [ТС] | 10 |
Спасибо всем, вроде некое понимание куда двигаться появилось.
Однако, в документации пишут, что РЕКОМЕНДУЕТСЯ: Посмотрел код Comparer<T> - мне, мягко говоря, не всё там понятно. Опасаюсь чуток непонятного. Куда понятнее код интерфейса IComparer<T>! Какие существенные минусы использования интерфейса IComparer<T>, а не абстрактного класса Comparer<T>? P.S. Я код исключительно для себя пишу.
0
|
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
|
|||||||||||
04.08.2020, 17:51 | 11 | ||||||||||
titan4ik, не вижу тут сложностей переделать пример Троелсена для наследования от
Comparer<T> . Visual Studio половину работы за вас сделает, а именно реализует дефолтный метод.
1
|
539 / 1227 / 37
Регистрация: 08.01.2017
Сообщений: 6,021
|
||||||
04.08.2020, 18:07 [ТС] | 12 | |||||
Только код из примера для необобщенного Compare не вяжется с обобщенным.
Но это не меняет суть ответа на вопрос. То есть, вы тоже за Compare<T>
0
|
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
|
||||||
04.08.2020, 18:12 | 13 | |||||
А при чем тут необобщенный Compare? Вы сами процитировали:
Не понял, что вы хотите сказать. В данном случае <Car> и есть обобщение. Я просто скопипастил кусок отсюда, лишнее можно удалить:
0
|
539 / 1227 / 37
Регистрация: 08.01.2017
Сообщений: 6,021
|
||||||
04.08.2020, 18:19 [ТС] | 14 | |||||
В случае использования обобщенного Comparer<T>, наверное достаточно такого кода:
0
|
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
|
|
04.08.2020, 18:19 | 15 |
Или вы про сам метод? Тогда я не пойму вашей логики. Запустите пример и посмотрите у себя, у меня все работает.
0
|
539 / 1227 / 37
Регистрация: 08.01.2017
Сообщений: 6,021
|
|
04.08.2020, 18:25 [ТС] | 16 |
Всё будет работать, но логика не вполне корректная.
В примере у Троелсена проверка на null проверяет результат приведения типа А в случае исп обобщенного Comparer<Car> приведение типа не нужно вообще, значит не нужна и проверка. А если параметр имеет значение null, то это учитывается уже внутри стандартного String.Compare(x.PetName, y.PetName); Мне так кажется.
0
|
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
|
|
04.08.2020, 18:26 | 17 |
Можно и так, если не нужно проверку на существование объекта делать. В примере Троелсена он скорее был сделан, чтобы проверить, что передали корректный класс, так как аргументы типа
object передаются, то есть метод не строго типизирован. Здесь же метод строго типизирован, риск только в том, что могут передать null , но тут, думаю, логичнее будет использовать дефолтный эксепшен.
0
|
539 / 1227 / 37
Регистрация: 08.01.2017
Сообщений: 6,021
|
|
04.08.2020, 20:39 [ТС] | 18 |
ок.
Добавлено через 1 час 28 минут Отвечаю на свои вопросы так, как я в итоге понял: 1. Да есть "кое-что ещё". Это абстрактный класс Comparer 2. Использовать проще обобщенные варианты интерфейса и класса 3. Вместо интерфейса IComparer лучше использовать абстрактный класс Comparer - с учетом пункта 2. - в обобщенном варианте - Comparer<T>. 4. Если использовать и IComparable<T> и Comparer<T>, то с пом IComparable<T> (применяется непосредственно к классу сравниваемого объекта) задается сравнение по умолчанию (оно будет использовать, например, если будут использоваться стандартные методы Sort() без параметров), а с пом Comparer<T> определяются специальные классы-компараторы, которые могут задавать иные способы сравнения объектов типа Т. Об этом в документации: Осталась одна деталь, насколько понимаю, при реализации в пользовательском классе-компараторе метода Compare (public override int Compare(T x, T y)) абстрактного класса Compare<T> можно использовать стандартные методы для стандартных типов - и Compare, и CompareTo - никакой разницы вроде нет. Правильно? Добавлено через 17 минут Но использовать CompareTo вроде как-то симпатичнее. В примере в док используется именно CompareTo.
0
|
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
|
|
04.08.2020, 20:56 | 19 |
1
|
539 / 1227 / 37
Регистрация: 08.01.2017
Сообщений: 6,021
|
|||||||||||
04.08.2020, 21:09 [ТС] | 20 | ||||||||||
Почему это плюс?
Добавлено через 8 минут вот этот код из примера док наверное можно упростить? Кликните здесь для просмотра всего текста
Во-первых this тут не нужны, а во-вторых "else" можно удалить: Кликните здесь для просмотра всего текста
Возражений нет?
0
|
04.08.2020, 21:09 | |
04.08.2020, 21:09 | |
Помогаю со студенческими работами здесь
20
Дополнительный метод сравнения объектов класса Вектор объектов пользовательского класса Подсчет созданных объектов пользовательского класса Очистка вектора объектов пользовательского класса Организация коллекции объектов пользовательского класса Вставка и удаление объектов пользовательского класса в deque Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |