您好我正在尝试设计一个算法,该算法给出了一组Person对象,如果有的话,给我它们之间的关系。
例如:
人A和B:
{ "name":"abc",
"address":"A main, B cross, C street, D state, E Country",
"age": 30,
"profession":"profession A"
}
{ "name":"xyz",
"address":"A main, B cross, C street, D state, E Country",
"age": 30,
"profession":"profession A"
}
在这里我会说这个人都具有相同的属性,所以我的算法应该将它们识别为别名,我所遵循的方法被赋予一个新的人物对象X我试图将这个人的属性与每个人相匹配&# 39;在DB中的s属性,这看起来很慢,我怎样才能提高效率呢?
答案 0 :(得分:4)
使用HashMap。
Map<Person, List<Person>> personMap = new HashMap<>();
覆盖hashCode()
类的equals()
和Person
方法。
请参阅 - Generating hashCode() for a custom class。
如果您的数据量巨大,则可以存储Person
数组或ID的索引或某些唯一标识符,而不是List<Person>
。您还需要快速设计哈希以生成。
您的hashCode()
和equals()
看起来像这样 -
@Override
public boolean equals(Object other) {
if (other == this) return true;
if (!(other instanceof Person)) {
return false;
}
Person person = (Person) other;
return person.getName().equals(this.getName()) &&
person.getAddr().equals(this.getAddr()) &&
person.getAge() = this.getAge() &&
person.getProfession().equals(this.getProfession());
}
//Idea from effective Java : Item 9
@Override
public int hashCode() {
int hash = 17;
hash = 31 * hash + this.getName().hashCode();
hash = 31 * hash + this.getAddr().hashCode();
hash = 31 * hash + this.getAge();
hash = 31 * hash + this.getProfession().hashCode();
return hash;
}
现在,如果您可以找到任何多余的字段来唯一标识某个人,则可以跳过hashCode()
和equals()
中的字段。比如说,如果每个人都可以通过他的姓名和地址进行唯一识别,那么您就不需要在这些方法中考虑age
和profession
,从而加快散列速度。
希望它有所帮助!
答案 1 :(得分:0)
我建议为Person类编写一个Comparator,从你的Set中创建List并订购列表。然后你可以一次完成 - 只需比较当前和下一个元素。比较器会根据属性比较Persons,因此所有别名都会在排序列表中相互匹配。
答案 2 :(得分:0)
将person的每个属性分配到数据库表中的特定列,并在这些列上创建索引可能会快速运行并完成工作。