【问题标题】:Issue with priority based LinkedList insertion基于优先级的 LinkedList 插入问题
【发布时间】:2012-08-16 15:23:53
【问题描述】:

这是基础类: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(new Issue(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]

我的代码哪里错了?

【问题讨论】:

    标签: java linked-list singly-linked-list


    【解决方案1】:

    您为什么不将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;
              }
    

    【讨论】:

      【解决方案2】:

      您应该将队列与控制逻辑分开。这样您就不会因为需要由内而外思考这一事实而感到困惑。我敢肯定,你会很容易得到这个错误。

      如果您无法按照自己的想法执行代码 -> 重构。

      【讨论】:

        【解决方案3】:

        我建议你写

         PriorityQueue<Issue> issues =  new PriorityQueue<Issue>();
        

        并使用 Comparable 实现 Class Issue。

        【讨论】:

          【解决方案4】:

          根据此代码,您将在优先级较低的问题之后插入新问题。

          while (tempQ.next != null
                        && tempQ.issue.getPriority() >   newIssue.getPriority()) {
              tempQ = tempQ.next;
          }
          
          newIssueQ.next = tempQ.next;
          tempQ.next = newIssueQ;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多