导出对象之间的关系

时间:2017-03-28 05:48:14

标签: java algorithm performance

您好我正在尝试设计一个算法,该算法给出了一组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属性,这看起来很慢,我怎样才能提高效率呢?

3 个答案:

答案 0 :(得分:4)

使用HashMap

Map<Person, List<Person>> personMap = new HashMap<>();

覆盖hashCode()类的equals()Person方法。

请参阅 - Generating hashCode() for a custom class

修改

如果您的数据量巨大,则可以存储Person数组或ID的索引或某些唯一标识符,而不是List<Person>。您还需要快速设计哈希以生成。

编辑2

您的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()中的字段。比如说,如果每个人都可以通过他的姓名和地址进行唯一识别,那么您就不需要在这些方法中考虑ageprofession,从而加快散列速度。

希望它有所帮助!

答案 1 :(得分:0)

我建议为Person类编写一个Comparator,从你的Set中创建List并订购列表。然后你可以一次完成 - 只需比较当前和下一个元素。比较器会根据属性比较Persons,因此所有别名都会在排序列表中相互匹配。

答案 2 :(得分:0)

将person的每个属性分配到数据库表中的特定列,并在这些列上创建索引可能会快速运行并完成工作。