对象的名称属性的类型为字符串,而依赖属性的类型与对象本身相同。现在,如果我创建该对象的一个实例并设置与依赖项属性相同的实例,则通过将其名称与依赖项名称进行比较来检查该对象是否自反,在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
答案 0 :(得分:0)
您将所有作业添加到有序列表中,而不考虑任何依赖项条件:
if (!orderedJobsArrayList.contains(job)) orderedJobsArrayList.add(job);
您是否曾经使用调试器来查看它通过了IsReflexive测试?实际上,如果没有,您会得到a, b, c, c
。
答案 1 :(得分:0)
对于a
和b
,由于它们没有依赖关系,因此hasDependency()
调用返回false
,因此它们仅被添加到orderedJobsArrayList
对于c
,您再次具有c
的依赖关系,从第一次if
检查起,它也被添加到列表中,因为列表不包含{{ 1}}的名称为Job
并具有一个依赖变量,则"c"
调用返回一个isReflexive(job, job.getDependency())
,因为true
,但是您的c.getName().equals(c.getName()) == true
条件为否定返回值的最大值,因此它不会延续到算法的底部。
if
中a, 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,因此您应从列表中删除该作业