Когда класс должен быть Сопоставимым и/или Компаратор?

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

Для вычисления n-граммного вектора просто выберите значение n (скажите, 3), и хешируйте каждую 3 последовательности слов во фразе в вектор. Нормализуйте вектор к единичной длине, затем возьмите скалярное произведение различных векторов для обнаружения подобия.

Этот подход был описан в Дж. Mitchell и M. Lapata, “Composition в Дистрибутивных Моделях Семантики, ” Когнитивистика, издание 34, № 8, стр 1388†“1429, ноябрь 2010., DOI 10.1111/j.1551-6709.2010.01106.x

134
задан yeaaaahhhh..hamf hamf 4 May 2015 в 09:25
поделиться

6 ответов

Текст ниже взят из Comparator vs Comparable

Comparable

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

Компаратор

Объект компаратора может сравнивать два разных объекта. Класс сравнивает не свои экземпляры, а экземпляры некоторых других классов. Этот класс компаратора должен реализовывать интерфейс java.util.Comparator .

236
ответ дан 23 November 2019 в 23:48
поделиться

Comparable позволяет классу реализовать собственное сравнение:

  • он находится в том же классе (часто это преимущество)
  • может быть только одна реализация (поэтому вы не можете использовать это, если хотите два разных случая)

Для сравнения, Comparator - это внешнее сравнение:

  • он обычно находится в уникальном экземпляре (либо в том же классе, либо в в другом месте)
  • вы называете каждую реализацию так, как хотите сортировать вещи
  • вы можете предоставить компараторы для классов, которые вы не контролируете
  • реализация можно использовать, даже если первый объект имеет значение NULL

. В обеих реализациях вы все равно можете выбрать то, что вы хотите сравнивать . С помощью дженериков вы можете объявить это и проверить это во время компиляции. Это повышает безопасность, но также сложно определить подходящее значение.

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

  • Comparable позволяет вам использовать его во всех кодах во время компиляции (что хорошо, если необходимо, или плохо, если нет, и вы теряете ошибку времени компиляции); ваша реализация должна справиться с объектами и преобразовывать их по мере необходимости, но надежным способом.
  • Comparable , напротив, очень строгий.
  • Забавно, когда вы подклассифицируете себя к подклассу, подкласс также должен быть сопоставимым и надежным об этом (или это нарушит принцип Лискова и даст вам ошибки во время выполнения).

    36
    ответ дан 23 November 2019 в 23:48
    поделиться

    Comparable предназначен для обеспечения упорядочения объектов данных по умолчанию, например, если объекты данных имеют естественный порядок.

    A Comparator представляет само упорядочение для специального использования.

    14
    ответ дан 23 November 2019 в 23:48
    поделиться

    Сопоставимый обычно предпочтительнее. Но иногда класс уже реализует Comparable , но вы хотите выполнить сортировку по другому свойству. Затем вы вынуждены использовать компаратор .

    Некоторые классы фактически предоставляют компараторы для общих случаев; например, String s по умолчанию чувствительны к регистру при сортировке, но есть также статический Comparator с именем CASE_INSENSITIVE_ORDER .

    8
    ответ дан 23 November 2019 в 23:48
    поделиться

    Comparable предназначен для объектов с естественным упорядочением. Сам объект знает, как его следует упорядочить.
    Компаратор предназначен для объектов без естественного упорядочивания или когда вы хотите использовать другой порядок.

    5
    ответ дан 23 November 2019 в 23:48
    поделиться

    Реализация Comparable означает « Я могу сравнить себя с другим объектом. » Это обычно полезно, когда есть одно естественное сравнение по умолчанию.

    Реализация Comparator означает « Я могу сравнить два других объекта. » Это обычно полезно, когда есть несколько способов сравнения двух экземпляров типа - например, вы можете сравнивать людей по возрасту, имени и т. д.

    148
    ответ дан 23 November 2019 в 23:48
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: