用于收集数学向量的好Java类

时间:2011-02-09 15:52:19

标签: java math collections vector

我正在实现一个图形(如Vertices,Edges,而不是笛卡儿)。我将图形建模为节点的物理集合(我已经制作了一个类)。

我希望有一组Forces,作为Vectors(在数学意义上),来表示作用于每个节点的力,理想情况下我希望能够以Node作为键执行查找,听起来像某种哈希查找表。

什么是好的收藏品,或者我必须自己制作?

如果有任何需要澄清的话,请问。

由于

3 个答案:

答案 0 :(得分:2)

如果我已正确理解您的需求,您基本上想要进行Node-> Vector的一对多映射。

如果您的Node正确实现了hashCode()和equals(),您可以使用Google Guava中的Multimap。这会自动提供Map<Node,Collection<Vector>>映射。

使用Multimap的好处是您不需要这样做:

Collection<Vector> vectors = nodeToVectorMapping.get(node);
if (vectors == null) {
    vectors = new HashSet<Vector>();
    nodeToVectorMapping.put(node, vectors);
}
vectors.add(vector);

相反,你只需要这样做:

nodeToVectorMapping.put(node,vector);

Multimap负责检查内部Collection是否存在。如果您发现自己进入多线程环境,那么“手动执行”方法将涉及同步以确保两个线程不会同时创建Collection,等等。谷歌的番石榴对所有这些都有很大的帮助,而且还有更多。

作为Google Collections的忠实粉丝(Multimap的原始主页,之后它被吸收到更大的Guava项目中),我还应该指向MapMaker的方向,它具有各种惊人的优点。它可能会找到有用的 - 大小限制,并发级别,基于键的值的惰性初始化,这类事情。我在一个高度并发的应用程序中使用过它们,它们在很多场合都挽救了我的生命! :)

答案 1 :(得分:1)

您可以简单地将矢量添加为Node类中的字段。

public class Node {
    private ForceVector force = ForceVector.getZeroForceVector();

    public ForceVector getForceVector() {
        return force;
    }
    public void addForceVector(ForceVector forceToAdd) {
        force = force.add(forceToAdd);
    }
}

我想象ForceVector是你用来描述力矢量的一些(不可变的)类。

答案 2 :(得分:0)

如果您有多个力量作用于每个节点,则需要将节点映射到 fource的集合,例如使用HashMap<Node, Set<Vector>>。请记住为您的节点正确实施equalshashCode

其他人可能会建议您将作用于节点的力放在节点类的字段中。这可能是也可能不是一个好的选择。如果您的目标是在其他应用程序中重用图形框架,那么使用单独的节点到力图可能会更好。