让我说我有MyClass{ private LargeMatrix mtrx; hashCode(){...}}
JGraphT(可能所有的Graph数据结构)似乎都在使用Hash表来映射顶点。那么当我使用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()
修改 矩阵有时可能是零或者是矩阵,它们会随着时间的推移而变化,因此我会尝试提出区分这些对象的东西,这似乎是愚蠢的解决方案。为什么图形不能仅通过向量中的位置选择顶点?
我应该重新发明轮子吗?使用向量而不是哈希表的图形?还是有工作?
答案 0 :(得分:2)
我会创建一个Vertex类并适当地实现equals()
和hashcode()
。速度影响不是很大,如果顶点的id是数字,它甚至可以更快。
答案 1 :(得分:0)
它确实有意义, 你的objectl1与l2相同,即使它存储在不同位置的内存中,对于图形它也是同一个顶点。
有没有理由说你需要在图中使用相同的顶点?也许有一个解决方法
答案 2 :(得分:0)
字符串在Java中是不可变的,因此l1和l2保证指向内存中完全相同的位置。这是该语言的一个很好的功能,它加快了字符串处理速度,但它会在这种情况下搞砸你。
这就是你得到循环异常的原因。我怀疑你想要一个无向图形结构。
有关参考,请参阅Java语言规范section 3.10.5:
- 同一个包中的同一个类(第8节)中的文字字符串(第7节) 表示对相同的参考 字符串对象(第4.3.1节)。
- 同一个包中不同类中的文字字符串 代表对它的引用 字符串对象。
- 不同包中不同类中的文字字符串 同样代表参考 相同的String对象。
答案 3 :(得分:0)
问题是这种图形不允许循环。您必须将图表的类型更改为AbstractBaseGraph
,您可以将变量loopAllowed
设置为true
,或者您可以尝试在SimpleDirectedGraph
中更改此变量。
问题:我无法更改SimpleDirectedGraph
中的变量,但您可以使用其他类型的图表来执行此操作。
我希望我能帮到你。