Java и JGraphT - Не понимаю результат - Передача по значению / ссылка на проблему или что-то еще?

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());
        }
    }

}
}

Выход

Create Schedule View Jobs Example$Job@20 1 9999
Create Schedule View Jobs Example$Job@1f 0 9999
Create Schedule View Jobs Example$Job@21 2 9999
Create Schedule View Prior Job Example$Job@1f 0 9999
Create Schedule View Prior Job Example$Job@20 1 9999
Setting Example$Job@20
Setting Example$Job@1f
Setting Example$Job@21
Added Times View Jobs Example$Job@20 1 1111
Added Times View Jobs Example$Job@1f 0 1111
Added Times View Jobs Example$Job@21 2 1111
Added Times View Prior Job Example$Job@1f 0 1111
Added Times View Prior Job Example$Job@20 1 9999

На шаге 4 не все значения времени работы отображаются как измененные с 9999 на 1111, несмотря на то, что шаг 3 показывает, что они есть. Я говорю о самом последнем ряду вышеприведенного вывода. Может ли кто-нибудь помочь мне понять, что происходит? Это сводит меня с ума!

Извините, если этот код не запускается сразу - я вручную скопировал его из системы, не связанной с внешним миром

С переопределенной 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

1 ответ

Решение

Я понял, что я делаю неправильно.

Это было связано с тем, как я добавлял вершины и ребра к графу, и как я переопределил hashCode() и equals().

addVertex (Job) и addEdge(Job, Job) добавляют объект в граф, только если граф еще не содержит его. 'Contain' использует equals().

Поскольку Job1 зависит от Job0, график не содержал ни одного из этих заданий, и поэтому оба были добавлены вместе с ребром между ними, как я и планировал.

Поскольку Job2 зависит от Job1, граф уже содержит "старый" объект Job1, равный "новому" объекту Job1. На данный момент у меня есть два объекта Job1, которые равны () друг другу, но отдельные объекты. Край, который я создал, был между Job2 и "новым" объектом Job1, которого на самом деле нет на графике!

Другие вопросы по тегам