comparator что это такое

Пишите компараторы правильно

Как обнаружилось, несоблюдение этих свойств — не такая уж редкая ситуация. Проблема возникает при сравнении вещественных чисел — float или double.

Предположим, у нас имеется класс с полем типа double, и мы хотим упорядочивать объекты этого класса в зависимости от значения поля. Нередко можно встретить такой код:

Ни рефлексивности, ни антисимметричности не наблюдается. Можно встретить и такую реализацию сравнения:

Здесь все три предыдущих сравнения выдадут ноль, то есть как будто бы свойства соблюдаются. Но, конечно, радоваться рано:

Здесь нарушается транзитивность: первый объект равен второму, второй равен третьему, но первый третьему не равен.

Чем же это грозит простому обывателю? Чтобы понять это, создадим простой список и попробуем его перемешать и посортировать несколько раз:

Вывод в каждом запуске отличается и может выглядеть, например, так:

Или для второй реализации compareTo :

Примерно в половине случаев элемент с NaN прибивается к началу или концу сортируемого списка, а в других случаях начинает блуждать, портя порядок окружающих элементов.

Первый вариант сравнивающей функции психоделичнее. Напишем, например, такой тест:

Мы вставили по пять элементов, содержащих NaN, и по пять элементов, содержащих каждую цифру от 1 до 9. В результате имеем следующее:

Вполне ожидаемо увидеть пять раз NaN: ведь они не равны друг другу. Но из-за неправильных сравнений и некоторые другие элементы вставились по нескольку раз. Можете сами посмотреть, что случится с TreeMap. Заметьте, что один случайно попавший NaN может испортить всю коллекцию, причём это не всегда легко отладить: коллекция может долго существовать в некорректном состоянии и делать вид, что всё нормально.

Что любопытно, этой проблемы вообще не должно существовать. Ещё в JDK 1.4 появились специальные статические методы Float.compare и Double.compare, которые сделают всё за вас, корректно обработав специальные случаи. Надо лишь написать:

Видимо, сказывается обманчивая простота алгоритма сравнения: порой программист считает, что проще написать самому, чем искать в документации стандартный способ сделать это.

Примеры неправильного сравнения double/float в различных открытых проектах: JTS, Batik, Hadoop, Hudson, ICU4J, Lucene. Трудно определить, в каких случаях это может привести к проблемам, но это тот случай, когда я бы исправлял безусловно: правильный и надёжный вариант обычно при этом ещё и короче неправильного.

Чтобы изменить ситуацию, я написал маленький детектор для FindBugs, который находит некорректно реализованные функции сравнения и предлагает использовать Float.compare/Double.compare.

Вообще для всех примитивных типов есть подобные методы. Если вам надо сравнить несколько полей по очереди, можно написать так:

Смотрится лучше, чем куча веток с больше и меньше. А если вы пользуетесь Guava или чем-то подобным, тогда так:

Источник

Компаратор принцип работы

Компаратор – это устройство, предназначенное для сравнения каких-либо величин (от лат. comparare – «сравнивать»).

Является операционным усилителем с большим коэффициентом умножения. Имеет входы: прямой и инверсный. При необходимости опорный сигнал может быть подключен к любому из них.

Как работает компаратор?

На один из входов подается постоянный сигнал, который называется опорным.

Он используется как образец для сравнения. Ко второму поступает испытуемый сигнал. На выходе стоит транзистор, меняющий свое состояние в зависимости от условий:

Соответственно, выходное напряжение меняется скачком от минимума до максимума, или наоборот.

Применение компаратора

Используются в схемах измерения электрических сигналов и в аналогово-цифровых преобразователях. В логических цепях работают элементы «или» и «не», также являющиеся компараторами. Соответственно, использование этого компонента не ограничивается конкретными примерами, поскольку он применяется повсеместно.

Стоит отметить, что устройство сравнения можно сделать из любого операционного усилителя, но не наоборот. Коэффициент усиления компаратора достаточно высок. Соответственно, его входы очень чувствительны к разнице напряжений между ними. Расхождение в несколько милливольт значительно изменяет напряжение выхода.

Таким образом, компаратор позволяет наблюдать минимальные колебания уровней входных напряжений.

Это делает его незаменимым элементом схем сравнения и измерительных приборов высокой точности:

Принцип действия аналогового компаратора

Аналоговый компаратор сравнивает непрерывные сигналы – входной измеряемый и входной опорный.

При медленном изменении входного сигнала, происходит многократное переключение компаратора за малый отрезок времени.

Такое явление называют «электронным дребезгом». Его наличие значительно снижает эффективность сравнения. Поскольку часто повторяющиеся смены состояния выхода, вводят оконечный транзистор в состояние насыщения.

Для уменьшения эффекта «электронного дребезга», в схему вводят ПОС – положительную обратную связь.

Она обеспечивает гистерезис – небольшую разницу между уровнем напряжения включения и отключения.

Некоторые компараторы имеют встроенную ПОС, что уменьшает количество дополнительных элементов построения конструкции.

Особенности цифрового компаратора

Цифровой компаратор – это однобитный аналогово-цифровой преобразователь.

Напряжение выхода представляет либо логический «0», либо «1».

На вход может быть подан как аналоговый, так и цифровой сигнал.

Устройство используется в качестве формирователя импульсов для сопряжения схем датчиков и устройств отображения.

Может применяться для анализа спектра звукового или светового сигнала.

Компаратор – это также логические элементы «или» и «не», используемые в вычислительной технике.

Теоретически при незначительно малых колебаниях уровня входного сигнала, может возникать состояние неопределенности выхода. На практике равенство измеряемого и опорного напряжений не наступает. Поскольку компаратор имеет ограниченный коэффициент усиления или положительную обратную связь.

Компаратор-микросхема

Промышленность выпускает компараторы в виде интегральных схем. Их использование позволяет создавать компактные приборы, с минимумом навесных элементов. Также преимущество малогабаритных деталей в незначительной длине соединительных проводников. В условиях повышенного электромагнитного излучения они являются приемными антеннами для всевозможных электрических помех.

Компаратор на операционном усилителе

У компараторов есть немалое сходство с операционными усилителями:

Пример практического применения компаратора

На принципиальной схеме представлен датчик освещенности.

Опорное напряжение задается резисторами RV1 и R2. При этом, RV1 служит регулятором чувствительности конструкции. Индикация реализована на светодиоде D1. Датчиком является элемент LDR1, который меняет омическое сопротивление в зависимости от освещенности. Собственно компаратор представлен операционным усилителем LM324. Это простое устройство демонстрирует то, как работает компаратор на практике.

Компараторы массы: понятие

Компаратор массы это устройство, предназначенное для уточнения разности значений массы гирь при контроле стандартов массы и веса, а также, для прецизионного взвешивания. Наиболее точные компараторы массы способны взвесить любой образец и сравнить его с иным, подобным ему. Происходит это на уровне атомов. Необходимость в таких устройствах возникает по причине несовершенства эталонных образцов мер веса и объема жидкости.

Типы компараторов

– компаратор для сравнения разнополярных сигналов;

– компаратор для сравнения однополярных сигналов.

Источник

Зачем нужен цифровой и аналоговый компаратор

Для управления электронными схемами применяются различные устройства, которые помогают настраивать и разветвлять сигналы. Для сравнения двух разных импульсов часто используется компаратор с однополярным питанием.

Обозначение и технические характеристики

Компаратор – это устройство, которое сравнивает два разных напряжения и силу тока, выдает конечный силовой сигнал, указывая на большее из них, одновременно производя расчет соотношения. У него есть две аналоговые вводные клеммы с положительным и отрицательным сигналом и один двоичный цифровой выход, как и у АЦП. Для отображения сигнала используется специальный индикатор.

УГО отображение компаратора выглядите следующим образом:

comparator что это такое. Смотреть фото comparator что это такое. Смотреть картинку comparator что это такое. Картинка про comparator что это такое. Фото comparator что это такоеФото — УГО компаратора

Изначально использовался только интегрированный компаратор напряжения (MAX 961ESA, PIC 16f628a), который известен как высокоскоростной. Он требует определенного дифференциального напряжения в определенном диапазоне, который существенно ниже, чем напряжение сети питания. Эти приборы не допускают никаких других внешних сигналов, которые находятся вне диапазона напряжения сети.

Сейчас гораздо чаще используется аналоговый цифровой компаратор (Attiny/ Atmega 2313), у которого транзисторный ввод. У него вводный потенциал сигнала находится в диапазоне менее 0,3 Вольт и не поднимается выше. Устройство может быть также ультра быстрого типа (стереокомпаратор), благодаря чему входной сигнал меньше обозначенного диапазона, к примеру, 0,2 Вольта. Как правило, используемый диапазон ограничивается только конкретным входным напряжением.

comparator что это такое. Смотреть фото comparator что это такое. Смотреть картинку comparator что это такое. Картинка про comparator что это такое. Фото comparator что это такоеФото — Компаратор

Помимо простого прибора, также существует видеоспектральный компаратор на ОУ (операционном усилителе). Это прибор, у которого очень тонко сбалансирована разница входа и высокого сопротивления сигнала. Благодаря такой характеристики, операционный компаратор используется в низкопроводимых схемах с небольшим вольтажем.

comparator что это такое. Смотреть фото comparator что это такое. Смотреть картинку comparator что это такое. Картинка про comparator что это такое. Фото comparator что это такоеФото — схема компаратора

В теории, частотный операционный усилитель работает в конфигурации с открытым контуром (без отрицательной обратной связи) и может быть использован в качестве компаратора низкой производительности. Но при этом, не инвертирующий вход (+ V) находится на более высоком напряжении, чем на инвертирующий (V-). Высокое усиление, выходящее из операционного усилителя, провоцирует выход низкого напряжения на входе в устройство.

Когда неинвертирующий вход падает ниже инвертирующего входа, выходной сигнал насыщается при отрицательном уровне питания, то он все равно может проводить импульсы. Выходное напряжение ОУ ограничивается только напряжением питания. Принципиальная электрическая схема ОУ работает в линейном режиме с отрицательной обратной связью, с помощью сбалансированного сплит-источника питания (питание от ± V S ). Многие приборы, работающие с компаратором, также имеют свойство фиксировать полученные данные при помощи видео-, фото- или документальной записи. Эти электронные принципы не работают в системах, где используются разомкнутые контуры и низкопроводящие элементы.

comparator что это такое. Смотреть фото comparator что это такое. Смотреть картинку comparator что это такое. Картинка про comparator что это такое. Фото comparator что это такоеФото — простой компаратор

Но у компараторного усилителя существует несколько существенных недостатков:

Из-за этих недостатков, компаратор для управления различными схемами, в большинстве случаев, используется без усилителя, исключением является генератор.

Компаратор предназначен для производственных процессов с ограниченным выходным напряжением, которое легко взаимодействует с цифровой логикой. Поэтому его часто используются в различных термических приборах (терморегулятор, реле температуры). Также его применяют для сравнения сигналов и сопротивлений таких устройств, как таймер, стабилизатор и прочая схемотехника.

Видео: компараторы

Принцип работы

Для того, чтобы продемонстрировать, как работает быстродействующий компаратор с гистерезисом, нужно взять схему с двумя выходами.

comparator что это такое. Смотреть фото comparator что это такое. Смотреть картинку comparator что это такое. Картинка про comparator что это такое. Фото comparator что это такоеФото — схема работы компаратора

Схема включения, по которой можно понять принцип работы компаратора, показана выше. Используя аналоговый сигнал во + входе, именуемым «неинвертируемым», и выходе, который называется под названием «инвертируемый», устройство использует два аналогичных разнополярных сигнала. При этом если аналоговый вход больше, чем аналоговый выход, то выход будет «1», и это включит открытый коллектор транзистора Q8 на эквивалентной схеме LM339, которую нужно включить. Но, если вход находится на отрицательном уровне, то сигнал будет равняться «0», из-за чего, коллектор будет находиться в закрытом виде.

Практически всегда двухпороговый или фазовый компаратор (например, на транзисторах, без усилителя) воздействует на входы в логических цепях, соответственно, работает по уровню определенной сети питания. Это своеобразный элемент перехода между аналоговыми и цифровыми сигналами. Такой принцип действия позволяет не уточнять определенность или неопределенность выходов сигналов, т. к. компаратор всегда имеет некий захват петли гистерезиса (независимо от её уровня) или окончательный коэффициент усиления.

Назначение

Зачем нужен компаратор и как его использовать без усилителя? В большинстве случаев, этот прибор применяется в несложных компьютерных схемах, где нужно сравнивать сигналы входящего напряжения. Это может быть зарядное устройство для ноутбука или телефона, весы (определитель массы), датчик сетевого напряжения AVR, таймер (компоратор типа lm 358, микроконтроллер и т. д. Также его применяют различные интегральные микросхемы для контроля входных импульсов, обеспечивая связь между источником сигнала и его центром назначения.

comparator что это такое. Смотреть фото comparator что это такое. Смотреть картинку comparator что это такое. Картинка про comparator что это такое. Фото comparator что это такоеФото — компараторы для компьютера

Наиболее популярным примером является компаратор триггер (регулятор) Шиммера. Он работает в режиме многоканальности, соответственно, может сравнивать большое количество сигналов. В частности, данный триггер применяется для того, чтобы восстановить цифровой сигнал, который искажает связь в зависимости от уровня напряжения и расстояния источника питания.

Это аналог стандартного компаратора, просто с более расширенным функционалом, который обеспечивает измерение нескольких входящих сигналов.

comparator что это такое. Смотреть фото comparator что это такое. Смотреть картинку comparator что это такое. Картинка про comparator что это такое. Фото comparator что это такоеФото — ОУ компаратор

Также есть компаратор шероховатости. Это устройство, которое помогает визуально определить состояние поверхности, которая уже подвергалась обработке. Применение этого приспособления обосновано необходимостью определять допуски обработанных ранее поверхностей.

Программирование и компаратор

Компоратор используется не только как часть электрической схемы ШИМ и т. д., его часто используют для создания отдельных программ или их компонентов. Например, устройство часто используется для создания java-коллекций.

Купить готовый компаратор можно в любом магазине радиотехнических приборов и электротехники. Цена прибора варьируется в зависимости от его назначения и количества каналов.

Источник

Comparable и Comparator

Два новых интерфейса java.lang.Comparable и java.util.Comparator были добавлены в версии Java 5. Использование данных интерфейcов в своих приложениях позволяет упорядочивать (сортировать) данные.

Интерфейс Comparable

В интерфейсе Comparable объявлен только один метод compareTo (Object obj), предназначенный для упорядочивания объектов класса. Данный метод удобно использовать для сортировки списков или массивов объектов.

Метод compareTo (Object obj) сравнивает вызываемый объект с obj. В отличие от метода equals, который возвращает true или false, compareTo возвращает:

Если типы объектов не совместимы при сравнении, то compareTo (Object obj) может вызвать исключение ClassCastException. Необходимо помнить, что аргумент метода compareTo имеет тип сравниваемого объекта класса.

Обычные классы Byte, Short, Integer, Long, Double, Float, Character, String уже реализуют интерфейс Comparable.

Пример реализации интерфейса Comparable

Результат выполнения программы:

В примере значения сортируются сначала по полю str (по алфавиту), а затем по num в методе compareTo. Это хорошо видно по двум строкам с одинаковыми значения str и различными num. Чтобы изменить порядок сортировки значения str (в обратном порядке), необходимо внести небольшие изменения в метод compareTo.

Интерфейс Comparator : compare, compareTo

В интерфейсе Comparator объявлен метод compare (Object obj1, Object obj2), который позволяет сравнивать между собой два объекта. На выходе метод возвращает значение 0, если объекты равны, положительное значение или отрицательное значение, если объекты не тождественны.

Метод может вызвать исключение ClassCastException, если типы объектов не совместимы при сравнении. Простой пример реализации интерфейса Comparator:

Результат выполнения программы:

Усложним пример, и реализуем несколько видов сортировки. Для этого создадим класс Product с полями name, price и quantity.

Создадим два класса (SortedByName, SortedByPrice), реализующих интерфейс Comparator для сортировки объектов по названию и по цене :

Пример использования Arrays.sort :

Результат выполнения программы:

Для сортировки объектов были реализованы два независимых компаратора по наименованию и по цене (SortedByName и SortedByPrice). Сортировка выполняется с помощью класса Arrays, у которого есть метод sort. Данный метод в качестве второго аргумента принимает тип компаратора.

Можно использовать также метод sort класса Collections, который в качестве первого входного аргумента принимает список объектов:

Отличие интерфейсов Comparator и Comparable

Интерфейс Comparable используется только для сравнения объектов класса, в котором данный интерфейс реализован. Т.е. interface Comparable определяет логику сравнения объекта определенного ссылочного типа внутри своей реализации (по правилам разработчика).

Comparator представляет отдельную реализацию и ее можно использовать многократно и с различными классами. Т.е. interface Comparator позволяет создавать объекты, которые будут управлять процессом сравнения (например при сортировках).

Источник

Выбор между Comparator и Comparable

Для реализации сортировки требуется, чтобы сортируемые объекты можно было сравнивать между собой на больше-меньше. Иначе говоря, чтобы было определено правило, которое позволит для любых двух объектов указать, какой из них в рамках данного контекста идет раньше, а какой позже.

В java эти правила определяются на уровне классов, к которым принадлежат объекты. Для примера возьмем класс для описания счета пользователя:

В зависимости от контекста сравнение счетов пользователя может происходить по разным правилам, например:

в приложении пользователь видит счета, отсортированные по currency, потом по value;

в админке счета всех пользователей отсортированы по дате изменения.

Для реализации сравнения на больше-меньше в java предусмотрено две возможности:

UserAccount реализует интерфейс Comparable В этом случае два объекта получают возможность сравнения между собой: acc1.compareTo(acc2)

Очевидно, что в некоторых случаях выбора между Comparable и Comparator нет. Если исходный класс нельзя модифицировать, или если требуются разные правила сравнения, то придется использовать Comparator. В остальных случаях, технически, можно использовать как Comparator, так и Comparable.

Согласно документации использование Comparable возможно, если для сравнения используется естественный порядок (class’s natural ordering). По ссылке есть представление разработчиков, что такое естественный порядок для стандартных классов (String, Date). Мне не удалось выяснить, что такое естественный порядок в общем случае. Выглядит, что это интуитивное представление разработчика о порядке в данном контексте. При этом даже для стандартных классов порядок может быть не интуитивен (в каком порядке должны идти значения BigDecimal с разной точностью, например 4.0 и 4.00?). Практика показывает, что «естественность» правил различается в понимании разных разработчиков и контекстов. Для меня необходимость опоры на интуицию является аргументом против использования Comparable.

При написании кода приходится лавировать между явностью и неявностью. Явность хороша тем, что для понимания участка кода требуется рассмотреть лишь узкий контекст его использования. В то же время неявность позволяет использовать одинаковые правила для всех участков кода. Разберем на примере: разработчику требуется отсортировать список счетов. Правила сравнения можно указать:

явно: Arrays.sort(accountsList, accountByValueComparator)

В случае явной передачи компаратора найти его использования элементарно. Я считаю это аргументом за использование компаратора. (Еще одним примером сложностей с поиском неявных использований может служить equals/hashCode, но альтернативы в виде «Equalator»-а для них нет).

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *