所以我意识到这种文本格式可能并不常见。但是,我一直在尝试许多想法,将其正确地读入所需的对象,并且知道必须有更好的方法。这是文件的样子:
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
A N g
H B b
U 2 GB 2 F 1
I N n
GA 2 GB 2
GB N g
所以每对的第一行是节点S的名称,无论是起始节点N / s,还是它的目标节点g / n 第二行是节点S的子节点和它们的距离权重。 例如,节点S具有距离为1的子节点B和距离为2
的子节点E.我正在处理两种对象类型,节点和边缘。 以下示例。 (建筑师省略)
有没有人有关于如何有效阅读此类输入的提示?
public class Edge {
public String start;
public String end;
public int weight;
public class Node {
public String name;
public boolean start = false;
public boolean goal = false;
public ArrayList<Edge> adjecentNodes = new ArrayList<Edge>();
答案 0 :(得分:1)
实际上你的问题几乎是过于宽泛和不明确,但我很乐意给你一些起点。但请理解,您可以轻松填写几个小时的计算机科学讲座;这不会发生在这里。
首先,你必须澄清一些要求(为你自己;或者与在这个项目上工作的人一起):
其次,建议顺序做事:
Map<Node, Integer>
- 意味着每个节点只知道它的邻居以及到达那里的距离!)并且,严肃地说:如果这是为了学校/学习:
最后,一些具体的提示:
很有可能使用&#34; public&#34; (可写)字段,如类中的start / end / ....但是:考虑不这样做。尝试隐藏尽可能多的类的内部。因为这样可以更容易(或可能!)以后更改程序的一部分,而无需更改任何其他内容。
示例:
class Edge {
private final int distance;
private final Node target;
public Edge(int distance, Node target) {
this.distance = distance; this.target = target;
}
...
这会创建一个不可变的对象 - 您无法在创建对象后更改其核心内部属性。这通常很有帮助。
然后:覆盖方法,例如 toString(), equals(), hashCode() ;并使用它们。例如,toString()可用于创建一个漂亮的,人类可读的节点转储。
最后:如果您喜欢所有这些,请考虑记住我的用户ID;当你在&#34; upvote&#34;中获得足够的声誉时,请回来并投票; - )