2016-08-02 5 views
0
import org.jgrapht.*; 
import org.jgrapht.graph.*; 

public class Example { 

// Cut down version of Job class 
private static class Job { 
    private final int jobNumber; 
    private int jobTime; 

    Job(int jobNumber){ 
     this.jobNumber = jobNumber; 
     this.jobTime = 9999; // A dummy value to make my issue obvious 
    } 

    public int getJobNumber(){ 
     return jobNumber; 
    } 

    public int getJobTime(){ 
     return jobTime; 
    } 

    public void setJobTime(int jobTime){ 
      this.jobTime=jobTime; 
     } 

    // eclipse derived 
    @Override 
    public int hashCode(){ 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + jobNumber ; 
     return result; 
    } 

    // eclipse derived 
    @Override 
    public boolean equals(Object obj) { 
     if (this ==obj) return true; 
     if (obj==null) return false; 
     if (getClass() != obj.getClass()) return false; 
     Job other = (Job) obj; 
     if (jobNumber != other.jobNumber) return false; 
     return true; 
    } 

    @Override 
    public String toString() { 
     return Integer.toString(System.identityHashCode(this)); 
    } 


} 

public static void main(String[] args) { 

    // Create a graph 
    final DirectedGraph<Job, DefaultEdge> schedule = new DefaultDirectedGraph<Job,DefaultEdge>(DefaultEdge.class); 

    // Create some jobs and add to graph 
    // Job 2 depends on Job 1 depends on Job 0 
    Job job; 
    Job dependsOnJob; 
    int counter=1; 
    while (counter < 3) { 
     int jobNumber = counter; 
     int dependsOnJobNumber = counter - 1; 

     job = new Job(jobNumber); 
     dependsOnJob = new Job(dependsOnJobNumber); 

     schedule.addVertex(job); 
     schedule.addVertex(dependsOnJob); 
     schedule.addEdge(dependsOnJob,job); 

     counter++;   
    } 

    // Print the current values of job numbers and times 
    // 1. 
    for (Job j : schedule.vertexSet()){ 
     System.out.println("Create Schedule View Jobs " + j + " " + j.getJobNumber() + " " + j.getJobTime()); 
    } 
    // 2. 
    for (Job j : schedule.vertexSet()){ 
     for (DefaultEdge e : schedule.incomingEdgesOf(j)){ 
      Job source = schedule.getEdgeSource(e); 
      System.out.println("Create Schedule View Prior Job " + source + " " + source.getJobNumber() + " " + source.getJobTime()); 
     } 
    } 

    // Change all job times to 1111 
    for (Job j : schedule.vertexSet()){ 
     System.out.println("Setting " + j); 
     j.setJobTime(1111); 
    } 

    // Print the new values of job numbers and times 
    // 3. 
    for (Job j : schedule.vertexSet()){ 
     System.out.println("Added Times View Jobs " + j + " " + j.getJobNumber() + " " + j.getJobTime()); 
    } 
    // 4. 
    for (Job j : schedule.vertexSet()){ 
     for (DefaultEdge e : schedule.incomingEdgesOf(j)){ 
      Job source = schedule.getEdgeSource(e); 
      System.out.println("Added Times View Prior Job " + source + " " + source.getJobNumber() + " " + source.getJobTime()); 
     } 
    } 

} 
} 

AusgabeJava und JGraphT - Ergebnis nicht verstehen - Pass auf Wert/Referenz Problem oder etwas anderes?

Create Schedule View Jobs [email protected] 1 9999 
Create Schedule View Jobs [email protected] 0 9999 
Create Schedule View Jobs [email protected] 2 9999 
Create Schedule View Prior Job [email protected] 0 9999 
Create Schedule View Prior Job [email protected] 1 9999 
Setting [email protected] 
Setting [email protected] 
Setting [email protected] 
Added Times View Jobs [email protected] 1 1111 
Added Times View Jobs [email protected] 0 1111 
Added Times View Jobs [email protected] 2 1111 
Added Times View Prior Job [email protected] 0 1111 
Added Times View Prior Job [email protected] 1 9999 

In Schritt 4 nicht alle Werte für Stückzeiten zeigen, wie 9999-1111 geändert wurde, trotz Schritt 3 zeigen, dass sie haben. Ich spreche von der letzten Zeile der obigen Ausgabe. Könnte mir jemand helfen zu verstehen, was vor sich geht? Das macht mich verrückt!

Entschuldigt, wenn dieser Code nicht sofort ausgeführt werden - ich habe es manuell gegenüber einem System kopiert nicht mit der Außenwelt verbunden

Mit der überschriebenen toString:

Create Schedule View Jobs 225534817 1 9999 
Create Schedule View Jobs 1878246837 0 9999 
Create Schedule View Jobs 929338653 2 9999 
Create Schedule View Prior Job 1878246837 0 9999 
Create Schedule View Prior Job 1259475182 1 9999 
Setting 225534817 
Setting 1878246837 
Setting 929338653 
Added Times View Jobs 225534817 1 1111 
Added Times View Jobs 1878246837 0 1111 
Added Times View Jobs 929338653 2 1111 
Added Times View Prior Job 1878246837 0 1111 
Added Times View Prior Job 1259475182 1 9999 
+0

Geändert - Entschuldigung – user2682459

+1

Dann sehe ich nichts falsch. Bitte poste ein [mcve]. –

+0

Ich habe die Ausgabe gepostet, die ich jetzt bekomme. Ich hoffe, dass dies das vollständige und überprüfbare erfüllt. Ich bin mir nicht sicher, wie viel ich rausschneiden kann, um es minimal zu machen. – user2682459

Antwort

0

Ich arbeitete heraus, was Ich habe falsch gemacht.

Es hatte damit zu tun, wie ich Scheitelpunkte und Kanten zum Graphen hinzufügte und wie ich hashCode() und equals() überschrieben hatte.

addVertex (Job) und addEdge (Job, Job) fügen dem Diagramm nur dann ein Objekt hinzu, wenn es im Diagramm nicht bereits enthalten ist. 'Enthalten' verwendet gleich().

Für Job1 hängt von Job0 ab, der Graph enthielt keine dieser Jobs und daher wurden beide hinzugefügt, zusammen mit einer Kante zwischen ihnen, wie ich es beabsichtigt hatte.

Für Job2 hängt von Job1 ab, das Diagramm enthielt bereits ein 'altes' Job1-Objekt, das dem 'neuen' Job1-Objekt entspricht. Ich habe an diesem Punkt zwei Job1-Objekte, die gleich() sind, aber getrennte Objekte. Die Kante, die ich erstellt habe, war zwischen Job2 und dem 'neuen' Job1-Objekt, das nicht wirklich in der Grafik ist!

Verwandte Themen