2015-04-22 4 views
1

Я пытаюсь представить сеть Ad Hoc, используя структуру матрицы смежности. Для этого я создаю ArrayList внутри другого ArrayList.Как добавить нулевой объект в ArrayList внутри ArrayList

Когда я добавляю новую вершину к графику, я создаю новый ArrayList (внутри супер ArrayList), и тогда у меня есть цикл для добавления нового нулевого объекта в каждый ArrayList, однако размер ArrayLists не увеличивается правильно, и я не могу понять, почему.

Вот мой код:

public class Matrix { 

public ArrayList<ArrayList<Edge>> graph; 
public ArrayList<Vertex> verticies; 
public ArrayList<Edge> edges; 

public Matrix() { 
    graph = new ArrayList(); 
    verticies = new ArrayList(); 
    edges = new ArrayList(); 
} 

public Matrix(ArrayList<Vertex> verticies, ArrayList<Edge> edges) { 

    this.verticies = verticies; 
    this.edges = edges;  
} 

public void addVertex(Vertex v) { 
    verticies.add(v); 
    graph.add(new ArrayList()); 

    for(int i=0; i<graph.size()-1; i++) { 
     graph.get(i).add(null); 
    } 
} 

Любая помощь будет принята с благодарностью.

ответ

3

Начальный размер является 0, поэтому for петля в addVertex() проходит один раз меньше, чем это необходимо:

public void addVertex(Vertex v) { 
    verticies.add(v); 
    graph.add(new ArrayList()); // graph now has size 1 

    for (int i = 0; i < graph.size() - 1; i++) { // i = 0, 0 < 0 is false  
     graph.get(i).add(null); // this is not executed for the last added list 
    } 
} 

В следующий раз, когда вы звоните addVertex() это добавит null к предыдущим ArrayList с, но а не только тот, который вы только что добавили.

Таким образом, вы, вероятно, следует сделать:

for (int i = 0; i < graph.size(); i++) 

Даже с этим исправлением, хотя, заметим, что если вы звоните addVertex() 5 раз у вас будет что-то вроде этого:

index    ArrayList 
    0  [null, null, null, null, null] 
    1  [null, null, null, null] 
    2  [null, null, null] 
    3  [null, null] 
    4  [null] 

Это, вероятно, не то, что вы хотите. Лучше было бы добавить все вершины первого:

public void addVertex(Vertex v) { 
    this.vertices.add(v); 
} 

А затем создать ArrayList с для матрицы смежности с соответствующим размером:

public void initializeAdjacencyMatrix() { 
    int n = this.vertices.size(); 
    for (int i = 0; i < n; i++) { 
     List<Edge> edges = new ArrayList<>(Collections.nCopies(n, null)); 
     graph.add(edges); 
    } 
} 

Кроме того, вы используете сырые типы при создании экземпляра ArrayList s. Это не очень хорошая практика. Вместо этого вы должны использовать алмазный оператор. Например:

graph = new ArrayList<>(); 
graph.add(new ArrayList<>()); 
+0

Спасибо за вашу помощь, однако теперь ArrayLists уменьшают размер на 1 каждый раз (например, если graph.size() равен 5, graph.get (1) .size() равен 5, graph.get (2) .size() равно 4 и т. д. На самом деле меня озадачивает D: –

+0

@AlexGlassman Это потому, что вы добавляете 'null' во все предыдущие списки каждый раз, когда вы создаете новый. Таким образом, у тех, которые были созданы вначале, будет больше' null'. Я обновил ответ с предложением об этом. –

+0

Хорошее обходное решение, однако мне нужно изменить тип моих внутренних массивов ArrayLists на Object. Любой путь вокруг этого? –

0

На этой линии:

for(int i=0; i<graph.size()-1; i++) { 

удалить -1. Из-за -1, когда размер графика равен i, не будет меньше 0, поэтому цикл не запускается. Если цикл не запускается, ваш код, который добавляет значение null, не может работать.

Смежные вопросы