Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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_Io_Adjacency Matrix - Fatal编程技术网

如何使用输入文本文件创建邻接矩阵来表示有向加权图[java]?

如何使用输入文本文件创建邻接矩阵来表示有向加权图[java]?,java,io,adjacency-matrix,Java,Io,Adjacency Matrix,我很难想出如何从输入文件创建邻接矩阵。输入文件应该表示一个有向的、加权的节点图 目的是创建一个可以进行迭代深度优先搜索的程序,但我真的被任务的数据输入部分卡住了 输入文本文件应该如下所示: 每个节点由两行文本表示。例如,在最上面的一行,第一个“S”是节点的名称,第二个“S”表示它是一个开始节点,第三个“n”表示它是一个常规节点,而不是一个目标节点,由“g”表示 第二行是连接到“S”的两个节点,第一个节点是加权距离为1的“B”,第二个节点是加权距离为2的“E” 第三行应该是空白的,并且重复该模式

我很难想出如何从输入文件创建邻接矩阵。输入文件应该表示一个有向的、加权的节点图

目的是创建一个可以进行迭代深度优先搜索的程序,但我真的被任务的数据输入部分卡住了

输入文本文件应该如下所示:

每个节点由两行文本表示。例如,在最上面的一行,第一个“S”是节点的名称,第二个“S”表示它是一个开始节点,第三个“n”表示它是一个常规节点,而不是一个目标节点,由“g”表示

第二行是连接到“S”的两个节点,第一个节点是加权距离为1的“B”,第二个节点是加权距离为2的“E”

第三行应该是空白的,并且重复该模式

S S n                     
B 1 E 2            


B N n

C 2 F 3


C N n

D 2 GA 4

D N n

GA 1

E N n

B 1 F 3 H 6

F N n

I 3 GA
 3 C 1

GA N g

H N n

I 2 GB 2 F 1

I N n

GA 2 GB 2

GB N g
我真的被这件事缠住了。我一直在使用缓冲读卡器扫描文件,但我一直想知道是否使用扫描仪会更容易

我目前正在尝试创建具有名称属性的节点对象,并且可能使用某种链接列表链接到其他相邻节点对象。我也考虑过使用节点对象数组,但我真的不确定如何表示哪些节点连接到哪些其他节点,以及如何使用二维数组将其构建到邻接矩阵中

如果您有任何建议,我将不胜感激。我是一名新手,因此,如果我的问题对其他人来说不具有学术重要性,我深表歉意

编辑:我的代码如下: 已执行的公共无效操作(操作事件e) {

编辑#2

我的节点对象如下所示:

public Node(String n, String t1, String t2)
{
    name = n;
    type1 = t1;
    type2 = t2;

    link1 = null;
    link2 = null;
    link3 = null;
    link4 = null;
    link5 = null;
    link6 = null;

问题是:您确实不想在这里使用二维数组。您想后退一步,设计/建模一个适合您正在处理的“实际问题”的类/数据结构

换句话说:你的问题是如何表示一个节点和边的图形。所以,下面是一些提示

让我们从以下内容开始:

enum NodeType { START, GOAL, NORMAL ; }

public class Node {
  private final String name;

  public Node(String name) {
    this.name = name;
上面给出了一个合理的方法来区分不同类型的节点。然后我们从节点的表示开始。显然,它的名称是固定的-你不想在节点创建后更改它的名称。然后你有如下设置器

public void setType(NodeType type) ...
还有更多的领域

private final Map<Node, Integer> neighbors = new HashMap<>();
[作为记录:理论上,您可以创建一个通过构造函数获取所有信息的类,从而避免使用setter方法。这有一定的优势,但会使事情变得更加复杂;我想……我在这里向您展示的已经够复杂了;-)]

这里的整个想法是——将解析与表示/构建对象的方式分开。当然,在某些时候,您必须读取这些字符串,然后从中构建节点对象

但您最好从上面这样的节点类开始,因为这样您就可以构建一个图,而无需解析文本文件:

Node n1 = new Node("n1");
n1.setType(NodeType.START);

Node n2 = new Node("n2");
n2.setType(NodeType.GOAL);

n1.setNeighborNode(n2, 5);
换句话说:首先你为一个图构建一个很好的“类模型”。你可以像上面那样编写测试代码。当所有这些都起作用时;然后你编写代码读取输入文件,并将其转换为构建图所需的方法调用


长话短说:当然,解析该文本文件很重要,但你不应该专注于此。相反:首先要想一想你的数据的类模型。也就是说,你可以学到最多,在实验中也最有乐趣。拉入字符串并将其转化为对象,这就是“工作”。先玩个痛快!

你能发布你迄今为止尝试过的代码并告诉我们失败的地方吗?当然,我想我真的有点卡住了。我应该做一个链表来跟踪哪些节点连接到哪些其他节点吗?还是有什么方法可以直接将文件读入二维数组,而不用费心创建所有这些对象?W对我来说困难的是,我不仅创建了数量未知的节点对象,而且还试图解释每个节点与其他节点之间可能存在的数量未知的连接。这让我非常困惑。有趣的是,我想我在几周前回答了一个非常类似的问题;就像完全相同的输入示例。如果你不知道你能告诉我这是什么课程吗?我找不到我当时写的答案……但我提出了一个更“概念化”的答案一个是给你的……还有一个提示:请花更多的时间格式化/缩进输入代码。你希望我们帮助你,所以请尽量简化。@GhostCat,很抱歉格式化不好,我会尽量小心。为了回答你的问题,这是我的“算法和数据结构”当然。我们的大学称之为ICS 340非常感谢你花时间来帮助我。我觉得你让我回到了正轨,谢谢你,非常欢迎。如果没有其他更好的答案,别忘了接受;-)但是慢慢来,我不介意今晚晚些时候进来的名声;-)x2
public void addNeighborNode(Node node, int weight) {
   neighbors.put(node, weight);
Node n1 = new Node("n1");
n1.setType(NodeType.START);

Node n2 = new Node("n2");
n2.setType(NodeType.GOAL);

n1.setNeighborNode(n2, 5);