Как обнаружить «сходство» данных - PullRequest
1 голос
/ 03 сентября 2010

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

Примите, что объекты похожи, если содержание объекта превышает 'n%'.

Кроме грубых действий, есть ли какие-либо библиотеки, которыми я могу воспользоваться?

спасибо

Ответы [ 5 ]

3 голосов
/ 03 сентября 2010

В качестве отправной точки взгляните на то, что называется Расстояние Левенштейна и посмотрите, имеет ли это отношение к вашему использованию?

1 голос
/ 04 сентября 2010

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

Однако у этой идеи так много проблем, поэтому я не думаю, что она осуществима. Среди них:

1) Понятие вес поддеревьев членов должно быть четко определено, чтобы иметь возможность возвращать процент сходства.

2) Как обрабатывать элементы данных, которые принадлежат только одному из объектов? это часто происходит при сравнении экземпляра класса A с экземпляром класса-потомка B.

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

1 голос
/ 03 сентября 2010

Это может быть сделано только в каждом конкретном случае. Если бы мне действительно нужна была эта функциональность, я бы определил интерфейс:

public interface Similar<Entity> {
boolean isSimilar(Entity other);
}

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

Наивная реализация Person:

public class Person implements Similar<Person> {
    private String firstName;
    private String lastName;

    public String getLastName() {
        return lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public boolean isSimilar(Person other) {
        if (other != null) {
            if (lastName.equalsIgnoreCase(other.getLastName())
                || (firstName.equalsIgnoreCase(other.getFirstName()))) {
                return true;
            }
        }

        return false;
    }
}
0 голосов
/ 04 сентября 2010

Вы можете реализовать интерфейс Comparable и определить свою собственную «логику» для сравнения экземпляров класса.

Как упоминалось ранее, для сходства текста вы можете использовать алгоритмы вычисления расстояний, которые вы можете найти вБиблиотека SimMetrics (http://www.dcs.shef.ac.uk/~sam/simmetrics.html).

Другой способ сравнения - сравнение хеш-кодов объектов (после переопределения метода hashCode () класса Object) - обратите внимание, что это именно то, что вы ищете.

0 голосов
/ 03 сентября 2010

Одна вещь, которую вы можете попробовать - это кодировать объекты, а затем сравнивать результат ... В частности, я сделал это с JSON.Чтобы определить, полностью ли совпадают объекты, это просто.

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