【问题标题】:Adding patients into my implemented linked list class将患者添加到我实现的链表类中
【发布时间】:2016-11-25 01:08:46
【问题描述】:

我编写了将患者添加到链接列表的程序。现在我能够得到输出。我调整了我的代码,以便它根据严重程度从高到低插入患者,如果严重程度相同,则根据时间。我的患者类具有三个属性名称、到达和严重程度。

编辑 3

我在Patient 类中添加了compareSeverity 方法。

public boolean compareSeverity(Patient other) {
 boolean result = false;
 if(other.severity > severity) {
  result = true;
 } else if(other.severity == severity) {
    if(other.arrival > arrival) {
     result = true;
    } else {
      result = false;
   }
  } else {
     result = false;
  }
  return result;
 }

这是PatientNode 代码 sn-p。

class PatientNode {
 public Patient data;
 public PatientNode next;

 public PatientNode(Patient data, PatientNode next) {
  this.data = data;
  this.next = next;
  }
}

这是linked list 类中的add 方法。

public void add(String name, int severity) {
 lastArrival++;
 Patient patient = new Patient(name, lastArrival, severity);
 PatientNode current, previous;
 current = head;
 previous = null;
 if(head == null) {
  head = current = new PatientNode(patient, head);
  size++;
 } else {
   while(current!=null) {
    //previous = current;
    if(current.data.compareSeverity(patient)) {
     PatientNode n = new PatientNode(patient,current);
     size++;
     n.next = current;
     if(previous==null) {
      head = n;
     } else {
       previous.next = n;
     }
   
     return;
    }
   previous = current;
   current = current.next;
  }
 }
}

我现在得到的输出是这样的,但是当问题似乎与 same severity 患者有关时。

我希望我的输出如下所示:

患者 1,到达 2,严重程度 3

患者 2,到达 3,严重程度 3

或者如果他们有不同的严重程度,那么像这样:

患者 1,到达 2,严重程度 2

患者 2,到达 1,严重程度 1

简而言之,severity 必须按降序排列,如果严重性相同则按照arrival 升序排列。

任何关于我如何根据严重程度存储患者的想法/指针或一些伪代码都会非常棒,谢谢。

【问题讨论】:

  • 您需要自己实现吗?你真的应该使用TreeSet
  • 是的,我必须自己实现。 @4castle

标签: java oop collections linked-list nodes


【解决方案1】:

您的 while 循环中有错误!

  1. 更改 LinkedList 中的某些内容时要小心:确保更改正确的节点。假设在您的情况下,当前列表是

    node1 --> node2 --> node4 --> node5
    

    我们有一个 PatientNode node3 必须插入到列表中 node4 之前,如下所示:

    node1 --> node2 --> **node3** --> node4 --> node5
    

    我们需要改变的只是node2next 字段必须是node3node3 本身的next 字段(必须是node4)。 如果我们查看您的代码,在 while 循环中,您有节点 np,分别是必须添加的新节点和迭代期间的当前节点。在循环中,您验证 n 是否必须在 p 之前,如果必须,您可以这样做:

    n.next = p.next;
    p.next = n; 
    

    这是错误的!将其与示例中的node3node4 进行比较:n 必须在p 之前,因为node3 必须在node4 之前。所以n对应node3,p对应node4您只需更改p(对应于node2n 节点的父节点的next 字段。您无需触摸p。要解决这个问题,您可以简单地更改 while 循环中的 if 语句:将 p.data 更改为 p.next.data

  2. 您在循环中遇到的另一个错误是您没有在添加患者的位置设置中断,因为它具有更高的arrival。但我建议您尽可能少使用breaks。当您设置 added 变量时,在循环条件中使用它的值:while(p.next!=null && !added){

  3. 这更像是一个建议:使用正确的else if-条件而不是使用if 作为if 中的唯一内容,这是else 子句中唯一的内容!

  4. 这也是一个建议。我强烈反对 LinkedList,其中最后一个节点保留指向第一个节点的指针(head)。尤其是在这里,因为如果 head 发生变化,则没有代码可以更新最后一个元素的 next 值。这可能会产生非常奇怪的结果(因为最后一个元素指向第二个元素而不是第一个元素)并且如果没有给予足够的注意可能会导致不同的错误(尤其是递归情况下的 stackoverflow 错误)

所以最后你的add-function 应该是这样的:

public void add(String name, int severity) {
    Patient patient;

    lastArrival++;
    patient = new Patient(name, lastArrival, severity);
    PatientNode n = new PatientNode(patient, null);

    if(head==null) {
      head = n;
      size++;
      return;
    } else if(n.data.getSeverity() > head.data.getSeverity()) {
      n.next = head;
      size++;
      head = n;
      return;
    }

    PatientNode p = head;
    boolean added = false;
    while(p.next!=null && !added) {
      if(p.next.data.getSeverity() < severity) {
        n.next = p.next;
        p.next = n;
        added = true;
      } else if(p.next.data.getSeverity()== severity && p.next.data.getArrival() > lastArrival) {
        n.next = p.next;
        p.next = n;
        added = true;
      }
      p=p.next;
    }
    if(!added) {
      p.next = n;
    }
    size++;
}

我在每种情况下都放回size++

我复制了您的代码以及我提出的更正并生成了minimal working code。我使用您发布的方法和 3 个字段(namearrivalseverity)。我试图在您发布的第一个输出中重新创建您的三个场景(似乎您有一种 remove 方法,但您没有发布它,所以最后一个案例并不完全相同)。您可以点击链接并检查输出。

【讨论】:

    【解决方案2】:

    使用 compareSeverity 更新代码后:

    • 条件if(other.arrival &gt; arrival) { 应该是if(other.arrival &lt; arrival) { 并且您的if 子句可以在compareSeverity 方法中简化,因为您只需要指定何时需要在true 而不是@987654327 上设置值@你初始化了你的变量。

      public boolean compareSeverity(Patient other) {
          boolean result = false;
          if((other.severity > severity) || (other.severity == severity && other.arrival < arrival)) {
              result = true;
          }
          return result;
      }
      

      因为它只是设置一个布尔值,你甚至可以让它变成:

      public boolean compareSeverity(Patient other) {
          return (other.severity > severity) || (other.severity == severity && other.arrival < arrival);
      }
      
    • 您在 while 循环之后忘记了 add 方法中的 if 条件。如果current变成null怎么办?当您无法将患者插入到链接列表中时会发生这种情况,因此您必须将其作为最后一个元素放在后面。

      public void add(String name, int severity) {
          lastArrival++;
          Patient patient = new Patient(name, lastArrival, severity);
          if(head == null) {
              head = new PatientNode(patient, head);
              size++;
          } else {
              PatientNode current, previous;
              current = head;
              previous = null;
              while(current!=null) {
                  if(current.data.compareSeverity(patient)) {
                      PatientNode n = new PatientNode(patient,current);
                      size++;
                      //n.next = current; // overkill
                      if(previous==null) {
                          head = n;
                      } else {
                          previous.next = n;
                      }
                      return;
                  }
                  previous = current;
                  current = current.next;
              }
              if(current == null){
                  previous.next = new PatientNode(patient, null);
                  size++;
              }
          }
      }
      

    我可以为您提供更新后的代码a working example

    【讨论】:

    • 好的,给我一些时间把它复制到我的程序中。希望我能拿出一些好消息。这是一些问题,我从昨天开始就一直在处理。
    • 是的,现在一切正常。我想我只是忘了放一些台词。这就是连续工作的问题。非常感谢。你一直很有帮助。我喜欢你如何简化 compareSeverity 方法。再次感谢。 :)
    • 这是我的荣幸 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多