这是基本课程:Issue(priority, description)
我有一个链表实现如下:
public class IssueQueue {
public Issue issue;
public IssueQueue next;
private static int count = 0;
public IssueQueue() {
}
public IssueQueue(Issue i) {
issue = i;
next = null;
}
public int getCount() {
return count;
}
public void Add(Issue newIssue) {
IssueQueue tempQ = this;
IssueQueue newIssueQ = new IssueQueue(newIssue);
if (count == 0) {
issue = newIssue;
} else if (issue.getPriority() > newIssue.getPriority()) {
while (tempQ.next != null
&& tempQ.issue.getPriority() > newIssue.getPriority()) {
tempQ = tempQ.next;
}
newIssueQ.next = tempQ.next;
tempQ.next = newIssueQ;
} else if (issue.getPriority() <= newIssue.getPriority()) {
newIssueQ.issue = issue;
newIssueQ.next = next;
issue = newIssue;
next = newIssueQ;
}
count++;
}
public void print() {
IssueQueue tempQ = this;
if (next == null) {
System.out.println(issue);
} else {
do {
System.out.println(tempQ.issue);
tempQ = tempQ.next;
} while (tempQ.next != null);
System.out.println(tempQ.issue);
}
System.out.println("--------------------");
}
}
问题在于,执行以下操作: iq.Add(新发行(10,“问题1”)); iq.print();
iq.Add(new Issue(4, "Issue 2"));
iq.print();
iq.Add(new Issue(20, "Issue 3"));
iq.print();
iq.Add(new Issue(2, "Issue 4"));
iq.print();
iq.Add(new Issue(12, "Issue 5"));
iq.print();
输出正确,直到第4次插入:
Issue[Priority: 20, Description: Issue 3]
Issue[Priority: 10, Description: Issue 1]
Issue[Priority: 4, Description: Issue 2]
Issue[Priority: 2, Description: Issue 4]
但是在第5次插入时,它变为:
Issue[Priority: 20, Description: Issue 3]
Issue[Priority: 10, Description: Issue 1]
Issue[Priority: 12, Description: Issue 5]
Issue[Priority: 4, Description: Issue 2]
Issue[Priority: 2, Description: Issue 4]
答案 0 :(得分:0)
为什么不将Collections.sort()
与您自己的优先级compareTo()
一起使用?
您实际上是在要求我们使用调试器来执行您的代码。但这看起来很奇怪
newIssueQ.next = tempQ.next;
tempQ.next = newIssueQ;
看看你甚至没有检查所有优先事项。我理解这遍历了列表,但是...尝试单步调试,你会看到。
else if (issue.getPriority() > newIssue.getPriority()) {
while (tempQ.next != null
&& tempQ.issue.getPriority() > newIssue.getPriority()) {
tempQ = tempQ.next;
}
答案 1 :(得分:0)
根据此代码,您将在优先级较低的问题之后插入新问题。
while (tempQ.next != null
&& tempQ.issue.getPriority() > newIssue.getPriority()) {
tempQ = tempQ.next;
}
newIssueQ.next = tempQ.next;
tempQ.next = newIssueQ;
答案 2 :(得分:0)
您应该将队列与控制逻辑分开。那么你不会因为你需要从内到外思考而感到困惑。我相信你很容易得到这个bug。
如果您无法遵循您的代码 - &gt;重构。
答案 3 :(得分:0)
我建议你写一下
PriorityQueue<Issue> issues = new PriorityQueue<Issue>();
用Comparable实现Class Issue。