Возвращение логического метода не учитывается в операторе if - PullRequest
1 голос
/ 25 июня 2019

Объект имеет атрибут имени типа String и атрибут зависимости того же типа самого объекта.Теперь, если я создаю экземпляр объекта и задаю тот же экземпляр, что и атрибут зависимостей, тогда проверка, является ли объект рефлексивным путем сравнения его имени с именем зависимости, не работает в операторе if.

class Job {

    private String name;
    private Job dependency;

    boolean hasDependency() {
        return dependency != null;
    }

    //getter,setters
}

&

class JobSequence {

    private ArrayList<Job> jobsArrayList;
    private ArrayList<Job> orderedJobsArrayList = new ArrayList<>();

    JobSequence(ArrayList<Job> jobsArrayList) {
        this.jobsArrayList = jobsArrayList;
    }

    void sortByDependency() {
        for (Job job : jobsArrayList) {
            if (!orderedJobsArrayList.contains(job)) orderedJobsArrayList.add(job);

            if (job.hasDependency()) {
                if (!isReflexive(job, job.getDependency())) {
                    if (!orderedJobsArrayList.contains(job.getDependency())) {
                        int index = orderedJobsArrayList.indexOf(job);
                        orderedJobsArrayList.set(index, job.getDependency());
                        orderedJobsArrayList.add(index + 1, job);
                    }
                }
            }
        }
    }

    private boolean isReflexive(Job i, Job j) {
        return i.getName().equals(j.getName());
    }
}

&

public class Main {
    public static void main(String[] args) {
        Job a = new Job("a");
        Job b = new Job("b");
        Job c = new Job("c");

        a.setDependency(null);
        b.setDependency(null);
        c.setDependency(c);

        ArrayList<Job> jobArrayList = new ArrayList<>();
        Collections.addAll(jobArrayList, a, b, c);

        JobSequence sequence = new JobSequence(jobArrayList);
        sequence.sortByDependency();
        sequence.getOrderedJobsArrayList().forEach(p -> System.out.println(p.getName()));
    }
}

Результат должен быть a, b НЕ a, b, c

Ответы [ 3 ]

0 голосов
/ 25 июня 2019

Для a и b, поскольку они не имеют зависимости, вызов hasDependency() возвращает false, следовательно, они просто добавляются к orderedJobsArrayList

Для c у вас снова есть зависимость как у самого себя c, с первой проверки if она также добавляется в список, поскольку список не содержит Job с именем "c" и с переменной зависимости, тогда вызов isReflexive(job, job.getDependency()) возвращает true, поскольку c.getName().equals(c.getName()) == true, но ваше условие if имеет отрицательное значение возвращаемого значения, поэтому оно не продолжается до нижней части алгоритма.

Результат a, b, c в orderedJobsArrayList правильный.

0 голосов
/ 25 июня 2019
import java.util.ArrayList;

class JobSequence {
    private ArrayList<Job> jobsArrayList;
    private ArrayList<Job> orderedJobsArrayList = new ArrayList<>();

    JobSequence(ArrayList<Job> jobsArrayList) {
        this.jobsArrayList = jobsArrayList;
    }

    void sortByDependency() {
        for (Job job : jobsArrayList) {
            if (!orderedJobsArrayList.contains(job)) orderedJobsArrayList.add(job);

            if (job.hasDependency()) {
                if (!isReflexive(job, job.getDependency())) {
                    if (!orderedJobsArrayList.contains(job.getDependency())) {
                        int index = orderedJobsArrayList.indexOf(job);
                        orderedJobsArrayList.set(index, job.getDependency());
                        orderedJobsArrayList.add(index + 1, job);
                    }
                }else {
                    orderedJobsArrayList.remove(job);
                }
            }
        }
    }

    private boolean isReflexive(Job i, Job j) {
        return i.getName().equals(j.getName());
    }

    public ArrayList<Job> getOrderedJobsArrayList() {
        return orderedJobsArrayList;
    }

    public void setOrderedJobsArrayList(ArrayList<Job> orderedJobsArrayList) {
        this.orderedJobsArrayList = orderedJobsArrayList;
    }
}

Try this-

Согласно вашей реализации вывод a, b, c идеален, поскольку вы добавили всю работу в список, т.е.

if (! OrdersJobsArrayList.contains (job)) ordersJobsArrayList.add (job);

Условие if (! IsReflexive (job, job.getDependency ())) оценивается как ложное в случае задания c , поэтому вы должны удалить это задание из списка.

0 голосов
/ 25 июня 2019

Вы добавляете все задания в упорядоченный список независимо от условий зависимости: if (!orderedJobsArrayList.contains(job)) orderedJobsArrayList.add(job);

Использовали ли вы отладчик, чтобы убедиться, что он проходит тест IsReflexive?На самом деле, вы бы получили a, b, c, c, если бы не было.

...