【问题标题】:Compare for Priority Queue in JAVA比较 JAVA 中的优先级队列
【发布时间】:2013-03-14 22:58:01
【问题描述】:

我现在要明确表示,这是为了大学作业。我想要帮助我学习的建议和答案,而不是复制和粘贴。我有一项需要模拟医院急诊室的任务。它是练习 ADT 和优先队列的实现。任务的条件之一是我需要创建一个 compareTo 方法,我猜这将有助于优先考虑进入急诊室的患者,它是根据严重程度确定的。如果严重性大于 17,我必须用 17 替换它,如果严重性小于 1,我必须用 1 替换它......我仍然对这个 compreTo 以及如何比较两个对象或 int 的精确度感到困惑:S....根据我在下面写的内容,有人可以向我解释如何比较严重性吗?

这只是一个粗略的粗略草稿,只是为了获得一个基本概念,我将有一个名为患者的对象,我假设它也将有一个名称和条件严重性......

//比较器方法...

严重性

如果(严重性 > 17){

如果(患者严重程度 > 其他患者)将严重程度替换为 17 严重性){返回1}

else if(患者严重程度 > 其他患者严重程度) { return -1 } else if (患者严重程度 == 其他患者严重程度) { return 0 } }

else if (严重性

如果(患者严重程度 > 其他患者)将严重程度替换为 17 严重性){返回1}

else if(患者严重程度 > 其他患者严重程度) { return -1 } else if (患者严重程度 == 其他患者严重程度) { return 0 } }

否则 {

如果(患者严重程度 > 其他患者)将严重程度替换为 17 严重性){返回1}

else if(患者严重程度 > 其他患者严重程度) { return -1 } else if (患者严重程度 == 其他患者严重程度) { return 0 } }

基本上问题是,您使用什么代码来比较两个对象或属于一个对象的两个整数。如果我在优先级队列中有许多要比较的项目,比较器如何工作。感谢所有帮助/输入!!!

【问题讨论】:

    标签: java oop queue priority-queue


    【解决方案1】:

    假设我们有一个类 Patient 和一个 int 变量 severity

    “如果一个 int 低于 min,则将其视为 min,如果它低于 maxed,则将其视为 max”的操作称为钳制。制作一个钳位辅助函数可能很有用,如下所示:

    public static int clamp(int value, int min, int max)
    {
       return value < min ? min : value > max ? max : value;
    }
    
    public int compareTo(Parent other)
    {
        int clampedSeverity = clamp(this.severity, 1, 17);
        int clampedOtherSeverity = clamp(this.severity, 1, 17);
        //do comparisons
    }
    

    现在,创建PriorityQueue - PriorityQueue 的语义是在任何插入时自动排序的集合的语义,这样最高比较元素(在本例中为最高严重性)位于开头。

    所以要插入PriorityQueue,我们可以通过ArrayList 来“支持”PriorityQueue,然后使用compareTo 对其进行二进制搜索,看看我们是否需要看起来更高、更低或我们有一场比赛。如果我们有匹配,那么我们可以在那里插入。如果我们没有找到匹配项,但我们将其范围缩小到比下面的元素更严重但比上面的元素少,我们可以将其插入那里。

    如果所有插入都保持PriorityQueue 排序,那么最严重的患者总是在最前面。

    【讨论】:

      【解决方案2】:

      您应该首先编写一个方法,将原始严重性转换为“标准化”严重性(即 1 到 17 之间的严重性)。然后你应该根据患者的标准化安全性来比较患者:

      private int normalizedSeverity(int severity) {
          if (severity < 1) {
              return 1;
          }
          if (severity > 17) {
              return 17;
          }
          return severity;
      }
      
      public int compare(Patient p1, Patient p2) {
          int severity1 = normalizedSeverity(p1.getSeverity());
          int severity2 = normalizedSeverity(p2.getSeverity());
          return Integer.compare(severity1, severity2);
      }
      

      【讨论】:

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