Entao, vc eh obrigado a usar matriz?! eh que pelo fato de vc poder colocar um novo ‘Nó’, ja significaria realocar sua matriz (com uma linha e uma coluna a mais), o que seria um saco. No seu caso vc ja esta tentando limitar isso atraves do construtor de GrafoMA, porem nodelist=new ArrayList(n); não vai impedir de incluir novos nodes quando o tamango de nodeList atingir ‘n’, então vc ja teria que controlar isso em addNote (se vc fez new GrafoMA(4), não pode ter mais de 4 nodes, pois se incluir um quinto, aqui matriz [posDoNodo(ori)] [posDoNodo(dest)]=rot; provavelmente vai dar pau)
De qualquer forma, eu faria mais ou menos assim:
public class Teste {
static class Aresta {
private final No de;
private final No para;
private final int tamanho;
public Aresta(No de, No para, int tamanho) {
this.de = de;
this.para = para;
this.tamanho = tamanho;
}
@Override
public String toString() {
return "De " + de + " para " + para + " com tamanho " + tamanho;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((de == null) ? 0 : de.hashCode());
result = prime * result + ((para == null) ? 0 : para.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Aresta other = (Aresta) obj;
if (de == null) {
if (other.de != null)
return false;
} else if (!de.equals(other.de))
return false;
if (para == null) {
if (other.para != null)
return false;
} else if (!para.equals(other.para))
return false;
return true;
}
}
static class No {
private final String nome;
private final Set<Aresta> arestas;
public No(String nome) {
this.nome = nome;
this.arestas = new HashSet<Aresta>();
}
public boolean addAresta(No para, int tamanho) {
return arestas.add(new Aresta(this, para, tamanho));
}
public Set<Aresta> getArestas() {
return Collections.unmodifiableSet(arestas);
}
public String getNome() {
return nome;
}
@Override
public String toString() {
return nome;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((nome == null) ? 0 : nome.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
No other = (No) obj;
if (nome == null) {
if (other.nome != null)
return false;
} else if (!nome.equals(other.nome))
return false;
return true;
}
}
public static void main(String[] args) {
No no1 = new No("no1");
No no2 = new No("no2");
No no3 = new No("no3");
No no4 = new No("no4");
No no5 = new No("no5");
no1.addAresta(no2, 3);
no1.addAresta(no3, 5);
no2.addAresta(no3, 6);
no2.addAresta(no4, 10);
no3.addAresta(no4, 1);
no3.addAresta(no5, 8);
no4.addAresta(no5, 7);
imprime(no1);
imprime(no2);
imprime(no3);
imprime(no4);
imprime(no5);
}
static void imprime(No no) {
System.out.println("Arestas do no " + no);
for (Aresta aresta : no.getArestas()) {
System.out.println(aresta);
}
}
}
Tenta entender ai. Para o que vc tem ai falta soh criar uma classe que gerencia uma lista de ‘nos’, mas nao vejo muito sentido ja que isso seria simplemente um List de No