2017-02-26 1 views
1

Ich suchte einige Male, aber bekam keine Ahnung.Java: Einen Bool für alle Instanzen einer Klasse setzen

Ich versuche, einen gerichteten Graphen einzurichten. Jeder Knoten (Instanz der class Node) sollte eine bool visited halten, um zu sehen, ob sie von einer Suchfunktion besucht wurde.

Nachdem die Suche abgeschlossen ist, möchte ich die bool visited für alle Instanzen der Klasse zurücksetzen, ohne sie erneut durchlaufen.

Kann ich irgendwie gehen - oder bin ich total auf dem Holzweg?

Vielen Dank für Hilfe und jubelt, Mike

// Cans.java 
public class Cans { 
    public static void main(String[] args) { 
     int[] fillLevels = {2,15,3}; 
     int[] states = {8,0,0}; 

     node MyNode = new node(3,0); 
     MyNode.setfillLevels(fillLevels); 

     node MyLink = new node(3,1); 

     MyNode.addLink(MyLink); 

     MyNode.setStates(states); 

     MyLink.printStates(); 

     System.out.println("Number of links: "+MyNode.getNumLinks()); 
    } 

    boolean fillState(node nodeA, int stateA,node nodeB, int stateB){ 
     int value = nodeA.getState(stateA); 
     nodeA.setState(stateA, value); 
     return true; 
    } 

} 

..

// node.java 
    import java.util.*; 

    public class node { 
     private int[] states; 
     private static int[] fillLevels; 
     private int level; 
     private int n_nodes; 
     private static int id0 = 0; 
     private int id; 
     private boolean visited; 

     List<node> next = new ArrayList<node>(); 

     node(int n_nodes,int level){ 
      id=id0; 
      id0++; 
      this.n_nodes = n_nodes; 
      this.level = level; 
      states = new int[n_nodes]; 
      visited = false; 
      fillLevels = new int[n_nodes]; 
     } 

     void setfillLevels(int[] fillLevels){ 
      this.fillLevels = fillLevels; 
     } 

     void setStates(int[] states){ 
      this.states = states; 
     } 

     void setState(int state, int value){ 
      states[state] = value; 
     } 

     int getState(int state){ 
      return states[state]; 
     } 

     void addLink(node linkedNode){ 
      next.add(linkedNode); 
     } 

     boolean isVisited(){ 
      return visited; 
     } 

     int getNumLinks(){ 
      return next.size(); 
     } 

     void printStates(){ 
      System.out.println("States of node #"+id+" on level "+level+":"); 
      int cntr = 0; 
      for(int i:states){ 
       System.out.println(cntr+": "+i); 
       cntr++; 
      } 
     } 
    } 
+1

bieten Beispiele für das, was Sie bisher getan haben. –

+0

Behalten Sie eine (statische?) Sammlung von Knoten, während Sie sie erstellen, und durchlaufen Sie sie, wenn Sie sie zurücksetzen möchten. – shmosel

+0

Also im Grunde: Sie müssen alle Instanzen durchlaufen, es gibt keinen anderen Weg. – Izruo

Antwort

2

Sie boolean Flagge mit dem Knoten nicht hinzufügen. Es ist keine gespeicherte Eigenschaft des Knotens, sondern eine vorübergehende Eigenschaft des Algorithmus, auf dem Sie ausgeführt werden.

stattdessen eine separate Gruppe von besuchten Knoten halten, und es sich um einen zusätzlichen Parameter übergeben, wie Sie Ihren Algorithmus auszuführen:

Set<Node> visited = new HashSet<>(); 

Statt node.visited = true der Einstellung visited.add(node) verwenden. Anstatt if (node.visited) ... zu prüfen, verwenden Sie if (visited.contains(node)) ...

Dieser Ansatz ermöglicht es Ihnen, alle besuchten "Flags" auf einmal zurückzusetzen, indem Sie visited.clear() aufrufen.

+0

Das habe ich gesucht! Groß. Danke, Alter. –

Verwandte Themen