【问题标题】:Boolean method return is not considered in the if statementif 语句中不考虑布尔方法返回
【发布时间】:2019-06-24 23:53:42
【问题描述】:

一个对象有一个String类型的name属性和一个对象本身相同类型的dependency属性。现在,如果我创建对象的一个​​实例并将相同的实例设置为依赖属性,那么通过将对象名称与依赖项名称进行比较来检查对象是否具有自反性在 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

【问题讨论】:

  • 你增加了三个工作,为什么要少呢?查看是否 (!orderedJobsArrayList.contains(job)) orderedJobsArrayList.add(job);
  • 我们正在讨论 foreach 循环中的第一个 if 语句。 (方法 sortByDependency)

标签: java if-statement boolean


【解决方案1】:

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

对于c,您再次将依赖项作为自身c,从第一个if 检查开始,它也被添加到列表中,因为列表不包含名称为Job"c"并且使用依赖变量,然后isReflexive(job, job.getDependency()) 调用返回一个true,因为c.getName().equals(c.getName()) == true,但是你的if 条件对返回值有一个否定,因此它不会继续到算法的底部。

orderedJobsArrayLista, b, c 的结果是正确的。

【讨论】:

    【解决方案2】:

    无论任何依赖条件如何,您都将所有作业添加到有序列表中: if (!orderedJobsArrayList.contains(job)) orderedJobsArrayList.add(job);

    您是否使用过调试器来查看它是否通过了 IsReflexive 测试?事实上,如果不是,你会得到a, b, c, c

    【讨论】:

      【解决方案3】:
      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 (!orderedJobsArrayList.contains(job)) orderedJobsArrayList.add(job);

      条件 if(!isReflexive(job, job.getDependency())) 在工作 c 的情况下评估为 false,因此您应该从列表中删除该工作.

      【讨论】:

      • 在将作业添加到列表之前,我最初检查了它是否具有自反性。这解决了我的问题。你的方法也不错。
      猜你喜欢
      • 2022-11-11
      • 2013-10-01
      • 2015-05-25
      • 1970-01-01
      • 2016-11-08
      • 2013-12-12
      • 2023-01-02
      • 2014-12-19
      • 1970-01-01
      相关资源
      最近更新 更多