Java:从同一个类</objects>引用ArrayList <objects>的对象

时间:2013-12-30 20:57:17

标签: java arraylist reference

我是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]。这可以实现吗?我怎么能这样做?可能我的课还需要一个构造函数呢?任何帮助真的很感激,谢谢。

6 个答案:

答案 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`
            }
}