0 Daumen
208 Aufrufe

Frage: Wie kann ich in meinem Code den Cannot resolve Symbol Fehler vermeiden? Hätte gedacht, dass es sich um ein Problem mit dem Datentyp handelt, aber der Datentyp ist korrekt.

Zu meinem Code: Ich möchte einen Array erstellen in dem Listen gespeichert sind. Die Array indexe sollen Knoten aus einem Graphen symbolisieren und in den Listeneinträgen sollen jeweils alle Kanten gespeichert sein, deren Ausgangsknoten der Knoten mit dem jeweiligen Index sein. Beispiel es gibt den Knoten 0 und 1 und die Kante (0,1). Dann soll in dem Array an Index 0 eine Liste sein, mit dem Element (0,1). Hierzu habe ich eine Klasse Edge erstellt, die die Kanten abbildet. Die Listen sind alle vom Typ Edge.

Der Fehler ist in der Zeile graph[i].get(j).from.equals(V)|| graph[i].get(j).to.equals(V)  und zwar bei dem from und to. Verstehe nicht wieso da ein fehler kommt, weil graph[i].get(j) liefert den Datentyp Edge zurück und mit from bzw. to müsste man dann auf die Attribute zugreifen können. Dachte ich zumindest :) 
Code:

public ArrayList<Edge> getIncidentEdges(int v) {
  Integer V = v; /* cast um equals Methode zu nutzen, da Edge generisch ist */
  ArrayList <Edge> incidentEdges = new ArrayList<>();
  for (int i = 0; i < graph.length; i++) {
      int j =0;
      while(j < graph[i].size()) {
          if (graph[i].get(j).from.equals(V)|| graph[i].get(j).to.equals(V)) {
          incidentEdges.add((Edge) graph[i].get(j));
          }
          j++;
      }
  }
  return incidentEdges;
}
Avatar von
Ich möchte

Du möchtest wahrscheinlich vor allem, dass dein Code kompiliert. Für diesen Schritt ist es unerheblich, was der Code machen soll. Was der Code machen soll, bezieht der Compiler nicht in seine Entscheidung ein, ob er daraus Bytecode erzeugt oder nicht.

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

Wenn ich ein Compiler wäre, dann würde ich hier schon "Cannot resolve Symbol" schreien. Wo ist denn graph definiert?

Bitte gib die ganze Klasse in deiner Frage an. Und die Klassen, die von deiner Klasse verwendet werden.

Verwende dazu auch die Möglichkeit, mittels der Schaltfläche </> Quelltext zu kennzeichnen.

ok. Hier ist der Code :) 

import java.util.ArrayList;
import java.util.List;

public class Graph {
  ArrayList [] graph;
  int numberOfEdges;
  public Graph (int n) {
      graph = new ArrayList[n];
      for (int i = 0; i < n; i++) {
          graph[i] = new ArrayList();
      }
      numberOfEdges=0;
  }
  public int getNumberOfNodes(){
      return graph.length+1;
  }
  public int getNumberOfEdges(){
      return numberOfEdges;
  }
  public Edge addEdge(int v, int w) {
      Edge edge = new Edge(v, w);
      graph[v].add(edge);
      graph[w].add(edge);
      numberOfEdges++;
      return edge;
  }
  public ArrayList<Edge> getIncidentEdges(int v) {
      Integer V = v;
      ArrayList <Edge> incidentEdges = new ArrayList<>();
      for (int i = 0; i < graph.length; i++) {
          int j =0;
          while(j < graph[i].size()) {
              if (graph[i].get(j).from.equals(V)|| graph[i].get(j).to.equals(V)) {
              incidentEdges.add((Edge) graph[i].get(j));
              }
              j++;
          }
      }
      return incidentEdges;
  }

}

public class Edge <T>{
  public T from;
  public T to;
  public Edge (T from, T to) {
      this.from= from;
      this.to= to;
  }
  public String toString(){
      return "from: "+ from +" to: "+to;
  }
}

1 Antwort

0 Daumen
 
Beste Antwort

weil graph[i].get(j) liefert den Datentyp Edge zurück

Nein. Die Methode get liefert ein Object zurück.

Um das zu ändern:

        ArrayList<Edge<Integer>> [] graph;

Avatar von 5,6 k

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community