Проблема Добавление инкрементной переменной члена класса в массив списков внутри цикла - PullRequest
0 голосов
/ 28 ноября 2010

Попытка добавить инкрементную переменную члена класса 'nNodeIndex' в arraylist, но в конце цикла все сохраненные значения идентичны последнему приращению итерации ??

Класс с переменной-членом:

import java.util.ArrayList;

public class Graph {

    private static ArrayList<GraphNode> Nodes = new ArrayList<GraphNode>();
    private static ArrayList<GraphEdge> Edges = new ArrayList<GraphEdge>();

    private static boolean diGraph;
    private static int nNodeIndex;

    private boolean uniqueEdge(int from, int to)
    {
        for(int i=0; i< Edges.size(); i++){
          if(Edges.get(i).from() == from && Edges.get(i).to() == to)
              return false;
        }
        return true;
    }

    private void removeInvalidEdges(int nodeIndex)
    {
        for(int i=0; i<Edges.size(); i++)
        {
            if(Edges.get(i).from() == nodeIndex)
                Edges.remove(i);
            if(Edges.get(i).to() == nodeIndex)
                Edges.remove(i);                    
        }
    }

    Graph(boolean directionalGraph)
    {
        diGraph     = directionalGraph;
        nNodeIndex  = 1;
    }

    public GraphNode getNode(int nodeIndex)
    {
        return Nodes.get(nodeIndex);
    }

    public int getIndexByVector(int x, int y)
    {
        for(int i=0; i<Nodes.size(); i++)
        {
            if(Nodes.get(i).x() == x && Nodes.get(i).y() == y)
                return i;
        }
        return -1;
    }

    public int nextFreeNodeIndex(){ return nNodeIndex; }

    public void addNode(GraphNode node)
    {
        if(Nodes.size() > 0)
            Nodes.add(node.index()-1, node);
        else
            Nodes.add(node);

        nNodeIndex++;  
    }

    public void removeNode(int index)
    {
        Nodes.get(index).setIndex(-1);

        removeInvalidEdges(index);
    }

    public void addEdge(GraphEdge edge)
    {
        if(uniqueEdge(edge.from(), edge.to()))
            Edges.add(edge);

        if(!diGraph)
        {
            if(uniqueEdge(edge.to(), edge.from()))
                Edges.add(new GraphEdge(edge.to(), edge.from()));
        }
    }

    public void removeEdge(GraphEdge edge)
    {
        for(int i=0; i<Edges.size(); i++)
            if(Edges.get(i).from() == edge.from() &&
               Edges.get(i).to() == edge.to())
            {
                Edges.remove(i);
            }
    }

    public int totalNodes(){ return Nodes.size(); }

    public int totalEdges(){ return Edges.size(); }

    public int nActiveNodes()
    {
        int count = 0;

        for(int i=0; i<Nodes.size(); i++)
        {
            if(Nodes.get(i).index() != -1 )
                count++;
        }

        return count;
    }

    public void reset()
    {
        nNodeIndex = 1;
        Nodes.clear();
        Edges.clear();
    }

}

Использование в основном классе:

  for(int row = 1; row <= boardWidth; row++){
       for(int col = 1; col <= boardHeight; col++){
          graph.addNode(new GraphNode(graph.nextFreeNodeIndex(), row, col));
       }
   }

Класс узла графика:

public class GraphNode extends Square {

    private static int indexNum;

    GraphNode(int n, int x, int y)
    {
        super(x,y);
        indexNum = n;
    }

    public int index(){ return indexNum; }
    public void setIndex(int index){ indexNum = index; }
}

1 Ответ

1 голос
/ 28 ноября 2010

Вам нужно показать нам класс GraphNode?Интересно, является ли индекс узла, удерживаемый им (устанавливается первым параметром, переданным в его конструкторе), статической переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...