在Java应用程序中,我需要一个存储结构,让它们称为节点,以及与其他节点的关系数量。例如,我需要知道节点A与B相关3次。
以实现这一点的方式思考我得到了这个可能的解决方案:使用节点作为键,使用另一个hashmap作为值的hashmap。此hashmap将节点存储为键(示例中为节点B),将整数存储为表示关系数的值。
您如何看待这个?这是一个好方法吗?
如果是这样,我有一个问题。假设我存储了字符串,并且在应用String.split函数后它们来自文本文件。现在我将“hello”存储在第一个hashmap中,但在处理完文件后,该字符串在第二个hashmap中显示为命运节点。这些字符串是否会引用同一个对象,或者我会拥有相同对象的多个副本?
答案 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>
,并且在读取文件的过程中,您可以维护此映射并在创建新映射之前检查对象是否存在。这是非常低的性能成本,一旦从文本构造对象,您就可以摆脱地图。