在if语句中不考虑布尔方法返回

时间:2019-06-24 23:53:42

标签: java if-statement boolean

对象的名称属性的类型为字符串,而依赖属性的类型与对象本身相同。现在,如果我创建该对象的一个​​实例并设置与依赖项属性相同的实例,则通过将其名称与依赖项名称进行比较来检查该对象是否自反,在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 :(得分:0)

您将所有作业添加到有序列表中,而不考虑任何依赖项条件: if (!orderedJobsArrayList.contains(job)) orderedJobsArrayList.add(job);

您是否曾经使用调试器来查看它通过了IsReflexive测试?实际上,如果没有,您会得到a, b, c, c

答案 1 :(得分:0)

对于ab,由于它们没有依赖关系,因此hasDependency()调用返回false,因此它们仅被添加到orderedJobsArrayList

对于c,您再次具有c的依赖关系,从第一次if检查起,它也被添加到列表中,因为列表不包含{{ 1}}的名称为Job并具有一个依赖变量,则"c"调用返回一个isReflexive(job, job.getDependency()),因为true,但是您的c.getName().equals(c.getName()) == true条件为否定返回值的最大值,因此它不会延续到算法的底部。

ifa, b, c的结果正确。

答案 2 :(得分:0)

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是完美的,因为您已将列表中的所有作业都添加了,即

如果(!orderedJobsArrayList.contains(job))orderedJobsArrayList.add(job);

如果作业 c ,条件 if(!isReflexive(job,job.getDependency()))的计算结果为false,因此您应从列表中删除该作业