存储节点关系,计算它们的数量

时间:2013-10-10 08:42:06

标签: java graph

在Java应用程序中,我需要一个存储结构,让它们称为节点,以及与其他节点的关系数量。例如,我需要知道节点A与B相关3次。

以实现这一点的方式思考我得到了这个可能的解决方案:使用节点作为键,使用另一个hashmap作为值的hashmap。此hashmap将节点存储为键(示例中为节点B),将整数存储为表示关系数的值。

您如何看待这个?这是一个好方法吗?

如果是这样,我有一个问题。假设我存储了字符串,并且在应用String.split函数后它们来自文本文件。现在我将“hello”存储在第一个hashmap中,但在处理完文件后,该字符串在第二个hashmap中显示为命运节点。这些字符串是否会引用同一个对象,或者我会拥有相同对象的多个副本?

1 个答案:

答案 0 :(得分:1)

关于第一个问题,我会做类似但不同的事情。我没有在Hashmap内创建Hashmap,而是创建一个类似于此的新类Relationship

public class NodeRelationship {
    private Node relatedNode;
    private int numOfRelations

    // Constructor + getters and setters
}

然后像这样定义你的地图:Map<Node, List<NodeRelationship>>这对我来说似乎更具可读性(但也许只是我),以后更容易消费。例如,如果您在列表上进行迭代并希望了解原始节点,则可以将成员parent添加到NodeRelationshio,依此类推。

关于第二个问题 - 它取决于您创建对象的方式以及是创建新对象还是使用现有对象。如果您有一个节点hello,您将其放入值Hashmap(或我的解决方案中的List)并使用相同的对象创建新密钥 - 那么就没有重复。如果您没有办法(或者只是不搜索)知道节点已经创建,并且您创建了新节点 - 那么您将拥有对象的重复。

如果您的每个节点确实是从文本字符串创建的,那么您可以维护一个新的Map<String, Node>,并且在读取文件的过程中,您可以维护此映射并在创建新映射之前检查对象是否存在。这是非常低的性能成本,一旦从文本构造对象,您就可以摆脱地图。