2016-08-02 10 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()); 
     } 
    } 

} 
} 

출력 단계 4에서Java 및 JGraphT - 결과를 이해하지 못함 - 값/참조 문제 또는 다른 것으로 전달 하시겠습니까?

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 

아니라 작업 시간의 모든 값들이 표시가 보여주는 3 단계에도 불구하고, 1111 ~ 9999로 변경 한 것으로서. 위 출력의 마지막 행에 대해 이야기하고 있습니다. 누군가 내가 무슨 일이 일어나는지 이해할 수 있도록 도와 줄 수 있습니까? 이것은 나를 미치게하고있다!

사과이 코드가 바로 실행되지 않는 경우 - 내가 수동으로 외부 세계 재정의 된 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

변경됨 - 사과 – user2682459

+1

그럼 내가 잘못 본 것이 없습니다. [mcve]를 게시하십시오. –

+0

지금 제가 얻은 결과를 게시했습니다. 나는 이것이 완전하고 검증 가능한 것을 만족시키기를 바랍니다. 내가 얼마나 더 작게 만들 수 있는지 잘 모르겠다. – user2682459

답변

0

무엇 나는 잘못하고 있었다.

그래프에 정점과 가장자리를 추가하는 방법과 hashCode() 및 equals()를 재정의 한 방법과 관련이 있습니다.

addVertex (Job) 및 addEdge (Job, Job) 그래프에 오브젝트가 아직없는 경우에만 그래프에 오브젝트를 추가하십시오. '포함'은 equals()를 사용합니다.

Job1의 경우 Job0에 따라 달라 지므로 그래프에는 이러한 Jobs가 포함되어 있지 않으므로 둘 다 추가되고 둘 사이에 가장자리가 추가됩니다.

Job2의 경우 Job1에 따라 달라지며 그래프에 '새'Job1 개체와 동일한 '이전'Job1 개체가 이미 포함되어 있습니다. 나는이 시점에서 두 개의 Job1 객체를 가지고 있는데, 서로 같지만 객체는 서로 같다. 내가 만든 가장자리는 실제로 Job2와 '새로운'Job1 객체 사이에 있으며, 실제로는 그래프에 없습니다!