Заблокирован

Метод сравнения объектов пользовательского класса

02.08.2020, 16:48. Показов 7424. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать метод сравнения достаточно сложных объектов пользовательского класса - для сортировки массива этих объектов.
Вижу, что есть два интерфейса: IComparable и IComparer
А может и ещё что-то есть (не знаю).
Какой из них использовать?
P.S.1. Не знаю важно это или нет, но сообщаю - эти объекты с рекурсией, то бишь, содержат в себе вложенные объекты того же типа (точнее - массив таких объектов).
P.S.2. Можно, конечно, вообще никакие интерфейсы не притягивать, но захотелось сделать правильно - задача-то стандартная и значит вроде нужно обозначить использование стандартного интерфейса))) Какого?


Добавлено через 12 минут
P.S.3. А тут ваще не получится "зацикливания"?
Есть массив объектов.
Каждый элемент массива тоже содержит массив объектов этого типа (возможно и нулевой длины).
Чтобы отсортировать массив, нужно иметь метод сравнения элементов. Но чтобы сравнивать элементы массива - объекты - нужно ведь уметь сортировать массив объектов, вложенный в каждый элемент массива (объект) ???)))
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2020, 16:48
Ответы с готовыми решениями:

Программа, использующая массив объектов пользовательского класса
Написать код программы, в которой реализовать следующие действия: - инициализировать массив из 5 элементов, каждый элемент которого...

Во всех классах реализовать интерфейс IComparable и перегрузить метод CompareTo для сравнения объектов
В программах требуется описать базовый класс (возможно, абстрактный), в котором задается интерфейс для производных классов. Во всех классах...

Для массива объектов класса «Студент» создать метод сортировки по различным критериям
Для массива объектов класса «Студент» создать метод сортировки по различным критериям (по фамилии, по среднему баллу успеваемости). Метод...

27
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
04.08.2020, 21:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от titan4ik Посмотреть сообщение
Почему это плюс?
Да впринципе не такой уж и плюс, если подумать. Можно заменить и на вызов не через объект, наверное просто дело вкуса.

Цитата Сообщение от titan4ik Посмотреть сообщение
Возражений нет?
Думаю this тут больше декоративный характер имеет, чтобы программисту было понятно, что данный элемент объявлен именно в этом классе, а не в базовом классе. Что касается else, то, наверное, это сделано в угоду масштабируемости программы. Если по какой то причине в будущем вместо return в каждой строке будет сохранение значения в переменную, то придется переписывать больше кода.
1
Заблокирован
05.08.2020, 15:04  [ТС]
Попутная тема - сравнение на равенство - переопределение метода Equals ит.п.
Поскольку более-менее разобрался методами Compare и CompareTo, и реализовал в нужном классе метод CompareTo,
то есть соблазн не делать ещё и метод Equals с полной реализацией, а просто использовать уже определенный метод CompareTo
Ведь он при равенстве выдает ноль.
То есть, код такой:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
 public static bool Equals(MyClass obj1, MyClass obj2)
        {
            if (obj1.CompareTo(obj2) == 0) return true;
            return false;
        }
 
 public bool Equals(MyClass other)
        {
            if (this.CompareTo(other) == 0) return true;
            return false;
        }

Нет ли в таком подходе крамолы?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.08.2020, 16:44
Цитата Сообщение от titan4ik Посмотреть сообщение
есть соблазн не делать ещё и метод Equals с полной реализацией
Если делаете полную реализацию сравнения на идентичность, то не забудьте переопределить Equals, GetHashCode и реализовать IEquatable<MyClass>.

Цитата Сообщение от titan4ik Посмотреть сообщение
Нет ли в таком подходе крамолы?
Хороший, верный подход: иметь реализацию в одном месте и использовать ее во всех перегрузках.
Небольшой рефакторинг:
C#
1
2
3
4
5
6
7
8
9
10
11
public static bool Compare(MyClass a, MyClass b) 
{
   if (ReferenceEquals(a, b)) return true;
   if (a == null) return -1;
   if (b == null) return 1;
 
   return /* Реализация сравнения по свойствам */
}
 
public static bool Equals(MyClass obj1, MyClass obj2) => Compare(obj1, obj2) == 0;
public bool Equals(MyClass other) => Equals(this, other);
1
Заблокирован
05.08.2020, 17:20  [ТС]
kolorotur,
вы какого-то мутанта зафигачили)
Наверное, вы имели ввиду вот это:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
public static int Compare(MyClass a, MyClass b) 
{
   if (ReferenceEquals(a, b)) return 0;
   if (a == null) return -1;
   if (b == null) return 1;
 
   return /* Реализация сравнения по свойствам */
}
 
public static bool Equals(MyClass obj1, MyClass obj2) => Compare(obj1, obj2) == 0;
public bool Equals(MyClass other) => Equals(this, other);
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.08.2020, 22:19
titan4ik, в чем мутация? В опечатке чтоли?
Ну простите - бывает. Первый метод int должен возвращать.
0
Заблокирован
05.08.2020, 22:32  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
в чем мутация? В опечатке чтоли?
Ага) Там две опечатки. Просто ваш авторитет настолько силен, что... сначала десять раз подумаешь, что что-то не понял, чем поверишь в опечатку.
Для справки - в случае с док майкросфта я теперь только 5 раз думаю, что не понял.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
05.08.2020, 22:37
titan4ik, мне кажется вы зря пытаетесь найти "идеальные решения", тратя на это кучу времени. Делайте так как кажется правильным, когда наступите на какие-нибудь грабли, исправитесь, или когда наберетесь опыта, это будет гораздо быстрее, чем заниматься подобными теоретическими изысканиями.
0
Заблокирован
05.08.2020, 22:46  [ТС]
QuakerRUS,
постараюсь учесть, но это субъективно наверное. Я-то считаю, что занимаюсь не теорией а сугубо практикой. А грабли у меня из каждой пятки пучками торчат).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.08.2020, 22:46

Задать метод события для множества объектов одного класса
Здравствуйте! Вынужден обратиться к опытным людям за советом. Имеется форма, на которой есть 60 label'ов. Необходимо, чтобы при событии...

Дополнительный метод сравнения объектов класса
Имеется класс для которого уже реализован интерфейс Comparable и перегружен метод compareTo. Сравниваются объекты лексикографически, а...

Вектор объектов пользовательского класса
Привет всем! Есть класс Automaton, я пытаюсь создать вектор Sample с объектами этого класса, а они ведут себя не так, как я ожидаю -...

Подсчет созданных объектов пользовательского класса
Создать класс SIGMOID таким образом, чтобы при уничтожении последнего объекта на экран выдавалось сообщение о наибольшее количество...

Очистка вектора объектов пользовательского класса
Здравствуйте. Есть вектор std::vector&lt;Morphology*&gt; MorphCollection который заполняется следующим образом: Morphology *Morph = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru