2011-03-23 75 views
1

比方说,我有MyClass{ private LargeMatrix mtrx; hashCode(){...}}图形数据结构

JGraphT(也许所有的图形数据结构)好像是用哈希表来顶点映射。那么当我使用MyClass而不是String l1,l2,l3时会影响速度吗?

这种情况下的优点和缺点是什么?我应该重写哈希码(删除矩阵哈希码)?有没有使用引用而不是哈希表的图形?

所以我的代码是:

package ann; 

import org.jgrapht.DirectedGraph; 
import org.jgrapht.graph.DefaultEdge; 
import org.jgrapht.graph.SimpleDirectedGraph; 

/** 
* @author marmoush 
* 
*/ 
public class Network 
{ 
    DirectedGraph<String, DefaultEdge> diGraph; 
    String l1="hello1"; 
    String l2="hello1"; 
    String l3="hello3"; 
    /** 
    * 
    */ 
    public Network() 
    { 

     diGraph = new SimpleDirectedGraph<String, DefaultEdge>(DefaultEdge.class); 
     diGraph.addVertex(l1); 
     diGraph.addVertex(l2); 
     diGraph.addVertex(l3); 

     diGraph.addEdge(l1, l2); 
     System.out.println(diGraph.containsEdge(l1,l2)); 
     // TODO Auto-generated constructor stub 
    } 

} 


Exception in thread "main" java.lang.IllegalArgumentException: loops not allowed 
    at org.jgrapht.graph.AbstractBaseGraph.addEdge(Unknown Source) 
    at ann.Network.<init>(Network.java:28) 
    at test.TestNetwork.main(TestNetwork.java:9) 

因为(我认为)l1.hashCode()==l2.hashCode()

编辑: 矩阵可能是零,有时还是那些,它们随时间变化,所以我会尽力拿出与区分这些对象的东西,这似乎是愚蠢的解决方案。为什么不能通过那里的位置选择顶点或什么?

我应该重新发明轮子吗?用一个使用Vectors而不是哈希表的图表?或者有工作?

回答

2

我将创建一个顶点类并实现equals()hashcode()适当。速度影响不是那么大,如果顶点的ID是数字,它甚至可以更快。

0

好吧,它确实有意义, 你的objectl1和l2是一样的,即使它存储在内存中的不同位置,对于图是同一个顶点。

是否有一个原因,为什么你需要在图中相同的顶点?也许有一种解决方法

+0

有时候这些矩阵可能是零,它们会随着时间而改变。所以我不会允许它通过散列码来选择 – 2011-03-23 13:54:52

+0

l1和l2永远不会存储在内存中的不同位置。看到我上面的答案。 – rtperson 2011-03-23 13:58:46

0

字符串在Java中是不可变的,所以l1和l2保证指向完全相同的在内存中的位置。这是该语言的一个很好的功能,它可以加快字符串处理的速度,但它会在这样的情况下让你感到困扰。

这就是为什么你会得到循环异常。我怀疑你想要一个无向图结构。

对于参考,请参见Java语言规格section 3.10.5

  • 同一类(§8)在同一封装(§7) 表示为相同的参考
    字符串 内文字字符串对象(§4.3.1)。
  • 同一包中不同类中的文字字符串 表示对同一个 字符串对象的引用。
  • 不同包中不同类中的文字字符串 同样代表对同一个String对象的引用 。
+0

就像澄清一样,l1和l2保证指向内存中完全相同的位置,因为它们都是用String文字初始化的。如果l2在初始化时像'String l2 = new String(“hello1”)'那么'l1 == l2'将是false。 – Soronthar 2011-03-23 14:01:38

+0

仍然哈希表的结果是相同的,它会抛出一个异常 – 2011-03-23 14:05:35

+0

我的问题是与字符串,它与HashTable被用作索引器,我想要使用列表或向量 – 2011-03-23 14:06:35

0

问题是这种图形不允许循环。您必须将图表种类更改为AbstractBaseGraph,您可以在其中将变量loopAllowed设置为true,或者您可以尝试在SimpleDirectedGraph中更改此变量。

问题:我无法更改SimpleDirectedGraph中的变量,但可以使用其他类型的图表来允许您这样做。

我希望我能帮助你。