我是Java新手,这可能很容易,但我坚持使用它。我必须创建表示图中所有节点的类Node。我将用它来实现像dfs这样的基本算法。我只需要使用一个字段,它是节点所有邻居的ArrayList。每个创建的节点都提供对其邻居的引用。到目前为止,这是我的班级:
public class Node{
protected ArrayList<Node> neighbours = new ArrayList<>();
public Node(ArrayList<Node> neighbours){
for(int i=0;i<neighbours.size();i++){
this.neighbours.add(neighbours.get(i));
}
}
public void setNeighbours(ArrayList<Node> neighbours){
this.neighbours=null;
}
public ArrayList<Node> getNeighbours(){
return this.neighbours;
}
}
在这种情况下,我有节点A =新节点([B,C]),例如,这是好的。有时我想使用A不作为ArrayList [B,C],而只是作为节点A,它仍然应该指向[B,C]。这可以实现吗?我怎么能这样做?可能我的课还需要一个构造函数呢?任何帮助真的很感激,谢谢。
答案 0 :(得分:1)
不希望使用传入的列表,而是复制其内容:
public void setNeighbours(ArrayList<Node> neighbours){
this.neighbours.clear();
this.neighbours.addAll(neighbours);
}
因为如果你使用它,另一个过程可能会在你的班级不知道变化的情况下改变它。
答案 1 :(得分:1)
是的,您可以创建默认构造函数。
public Node() {}
这样你就可以创建一个空节点
Node A = new Node();
仍然使用你描述的类
Node A = new Node(listOfNeighbors);
另外,对于新创建的空节点的set方法,我建议使用Bohemian发布的内容,即清除成员列表内容后复制传入的列表内容:https://stackoverflow.com/a/20847517/772385
答案 2 :(得分:0)
如果将构造函数参数更改为Array,则:
public Node(Node... nodes){
}
节点A =新节点(b,c);
在构造函数中你应该像这样写:
Arrays.asList(nodes)
它返回List
答案 3 :(得分:0)
如果我正确地解释您的问题,您已经完成了。如果要将节点A称为节点A,只需在代码中添加A
(变量名称)即可。当你想要它的邻居时,只需将A.getNeighbours()
放入。
节点A是节点。邻居只是该节点的属性(字段)。这意味着通过名称引用节点意味着它被用作节点。与getNeighbours()
一起使用它意味着它被用作数组(在您的示例中,[B, C]
)
答案 4 :(得分:0)
我不确定这完全是你所要求的,但你可能需要的是每个节点中的某种数据字段。这样,您可以根据它的数据识别节点,而不仅仅是它连接到的节点列表。按照现在的情况,你只能根据他们的联系进行搜索,因为他们没有任何识别属性。
答案 5 :(得分:0)
不确定回答您的问题,但第一步是通过边缘定义图形,如链接列表,指示源节点和目标节点。然后执行算法dfs,你得到了路径邻居的标记,而不是再次通过他,这样每个节点都应该有一个属性名和一个状态。
public class DephFirstSearch {
Vertex vertice[];
ArrayList list=new ArrayList();
public DephFirstSearch(int tam,ArrayList list)
{
vertice = new Vertex [tam];
vertice[0]= new Vertex("V0", false);
vertice[1]= new Vertex("V1", false);
vertice[2]= new Vertex("V2", false);
vertice[3]= new Vertex("V3", false);
vertice[4]= new Vertex("V4", false);
vertice[5]= new Vertex("V5", false);
vertice[6]= new Vertex("V6", false);
this.list=list;
}
public void dfs(String origen) {
dfsVisit(vertice[0], 0);
}
public void dfsVisit(Vertex nodo, int i) {
nodo.setState(true);
System.out.println("nodo: " + nodo.getNode());
for (int j = 0; j < vertice.length; j++) {
if (isEdge(i, j) && vertice[j].isState() != true) {
dfsVisit(vertice[j], j);
}
}
}
public boolean isEdge(int i, int j) {
Vertex actual = vertice[i];
Vertex next = vertice[j];
Vector lac;
for (int k = 0; k < list.size(); k++) {
lac = (Vector) list.get(k);
if (lac.getOrigin().equals(actual.getNode())
&& lac.getDestination().equals(next.getNode())) {
return true;
}
}
return false;
}
public class Vertex
{
String node;
boolean state;
public Vertex(String node, boolean state) {
super();
this.node = node;
this.state = state;`enter code here`
}
}