Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 图形数据结构_Java_Data Structures_Graph - Fatal编程技术网

Java 图形数据结构

Java 图形数据结构,java,data-structures,graph,Java,Data Structures,Graph,假设我有MyClass{private LargeMatrix mtrx;hashCode(){…}} JGraphT(可能是所有图形数据结构)似乎正在使用哈希表映射顶点。那么,当我使用MyClass而不是字符串l1、l2、l3时,这会影响速度吗 在这种情况下有什么利弊?我应该重写hashcode(删除矩阵hashcode)吗?有没有使用引用而不是哈希表的图形 所以我的代码是: package ann; import org.jgrapht.DirectedGraph; import org.

假设我有
MyClass{private LargeMatrix mtrx;hashCode(){…}}

JGraphT(可能是所有图形数据结构)似乎正在使用哈希表映射顶点。那么,当我使用MyClass而不是
字符串l1、l2、l3
时,这会影响速度吗

在这种情况下有什么利弊?我应该重写hashcode(删除矩阵hashcode)吗?有没有使用引用而不是哈希表的图形

所以我的代码是:

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)
包ann;
导入org.jgrapht.DirectedGraph;
导入org.jgrapht.graph.DefaultEdge;
导入org.jgrapht.graph.SimpleDirectedGraph;
/**
*@作者marmoush
* 
*/
公共班级网络
{
有向图;
字符串l1=“hello1”;
字符串l2=“hello1”;
字符串l3=“hello3”;
/**
* 
*/
公共网络()
{
有向图=新的SimpleDirectedGraph(DefaultEdge.class);
有向图。添加顶点(l1);
有向图。添加顶点(l2);
有向图。添加顶点(l3);
有向图.加差(l1,l2);
System.out.println(有向图包含sedge(l1,l2));
//TODO自动生成的构造函数存根
}
}
线程“main”java.lang.IllegalArgumentException中出现异常:不允许循环
位于org.jgrapht.graph.AbstractBaseGraph.addEdge(未知源)
在ann.Network.(Network.java:28)
位于test.TestNetwork.main(TestNetwork.java:9)
因为(我认为)
l1.hashCode()==l2.hashCode()

编辑: 矩阵有时可能是零,有时可能是一,它们会随着时间的推移而变化,所以我会尝试提出一些区分这些对象的方法,这似乎是一个愚蠢的解决方案。为什么图形不能通过向量中的位置选择顶点呢

我应该重新发明轮子吗?使用向量而不是哈希表的图形?还是有一个解决办法?

嗯,这是有道理的, 您的objectl1与l2相同,即使它存储在内存中的不同位置,对于图形,它是相同的顶点


是否有需要在图形中创建相同顶点的原因?也许有一个解决办法

字符串在Java中是不可变的,因此l1和l2保证指向内存中完全相同的位置。这是该语言的一个很好的特性,它大大加快了字符串处理速度,但在这种情况下它会把你搞砸

这就是为什么会出现循环异常。我想这里需要一个无向图结构

有关参考,请参阅Java语言规范:

  • 同一包(§7)中同一类(§8)中的文字字符串 表示对相同内容的引用
    字符串对象(§4.3.1)
  • 同一包中不同类中的文本字符串 表示对相同对象的引用 字符串对象
  • 不同包中不同类中的文本字符串 同样表示对 相同的字符串对象

我将创建一个顶点类,并适当地实现
equals()
hashcode()
。速度影响并不是很大,如果顶点的id是数字,速度甚至会更快。

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

问题:我无法更改
SimpleDirectedGraph
中的变量,但您可以使用其他类型的图形来执行此操作


希望我能帮助您。

有时这些矩阵可能是零,并且它们会随着时间的推移而变化。所以我不会允许通过hashcodel1选择它,l2永远不会存储在内存中的不同位置。请看我上面的答案。正如澄清的那样,l1和l2保证指向内存中完全相同的位置,因为它们都是用字符串文本初始化的。如果l2初始化为
String l2=new String(“hello1”)
,则
l1==l2
将为false。哈希表结果仍然相同,引发异常。我的问题不是字符串,而是哈希表用作索引器,我想使用列表或Vector@Soronthar-正确。谢谢你的澄清。今天我学到了一些新东西。@ismail marmoush-我不熟悉JGraphT框架,所以我不能确定是否可以使用列表或向量,尽管它应该可以工作。哈希表应该将两个相同的字符串散列到相同的位置,而列表可能不会这样做。不要使用Vector类——它会同步每个方法,并会不必要地降低代码的速度。向量类是一个遗留的遗迹,已经存在了十多年了。