一般来说,你能否建议一种让我测试物体以确保它们相似的方法。
如果超过'n%'的对象内容相同,则接受对象是相同的。
除了蛮力外,还有可以利用的库吗?
感谢
答案 0 :(得分:3)
作为一个起点,看一下名为Levenshtein distance的内容,看看它是否与您的使用相关?
答案 1 :(得分:1)
这只能根据具体情况进行。如果我真的需要这个功能,我会定义一个接口:
public interface Similar<Entity> {
boolean isSimilar(Entity other);
}
每个实现类都可以定义与另一个实例“相似”的含义。要记住的事项与克隆时要记住的问题相同:浅拷贝与深拷贝等等。
天真实施人:
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;
}
}
答案 2 :(得分:1)
如果您专注于特定问题的详细信息,我相信您可以找到一个好的解决方案。对于一般情况,我想到的唯一“合理”解决方案是基于reflection:扫描数据成员并递归地找到相应成员对的相似性。
然而,这个想法存在很多问题,所以我认为这不可行。其中:
1)应该很好地定义成员子树的权重的概念,以便能够返回相似性百分比。
2)如何处理仅属于其中一个对象的数据成员?在将类A的实例与后代类B的实例进行比较时,这种情况经常发生。
3)也许最大的问题是:对象的内部结构与其抽象数据表示之间的映射不是一个内射函数。例如,由于表重新分配的历史不同,表示相同映射的两个哈希映射可能具有不同的内部结构。
答案 3 :(得分:0)
你可以尝试的一件事是编码对象然后比较结果......特别是我用JSON完成了这个。为了检测对象是否完全匹配,这很简单。
答案 4 :(得分:0)
您可以实现Comparable接口并定义自己的'逻辑'来比较类的实例。
如前所述,对于文本相似性,您可以使用距离计算算法,您可以在SimMetrics库中找到它(http://www.dcs.shef.ac.uk/~sam/simmetrics.html)。
比较的另一种方法是比较对象哈希码(在覆盖Object类的hashCode()方法之后) - 请注意确保它正是您要查找的内容。