compareTo和equals方法在这个例子中如何工作?

时间:2015-12-30 15:11:20

标签: java

我不理解compareTo()方法和equals()方法。它们如何在下面的代码中工作?请为我描述一下,看看我在这些方法下的评论。

我不明白它是如何根据prio为每位患者打印出的患者。帮助将不胜感激。

 import java.util.PriorityQueue;

public class Patient implements Comparable<Patient>  {
    private String firstname;
    private String lastname;
    private String personNbr;
    private int prio;
    private int number;
    private static int total = 0;

    public Patient(String firstname, String lastname, String personNbr, int prio) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.personNbr = personNbr;
        this.prio = prio;
        total++;
        number = total;

    }

    public int compareTo(Patient rhs) {
        if(prio==rhs.prio) {
            return number - rhs.number; // what happens here?
        } else {
            return prio - rhs.prio; // what happens here?
        }
        }

    public boolean equals(Object rhs) {
        if (rhs instanceof Patient) {  // what happens here?
        return compareTo((Patient) rhs) == 0; // what happens here?
        } else {
        return false;
        }
        }

    public String toString() {
        return this.firstname + this.lastname + this.personNbr + this.prio;

    }

    public static void main(String[] args) {

        PriorityQueue<Patient> pq = new PriorityQueue<Patient>();
        pq.offer(new Patient("Kalle", "Karlsson", "8503622-1213", 3));
        pq.offer(new Patient("Lisa", "Svensson", "840312-1224", 7));
        pq.offer(new Patient("Lena", "Nilsson", "820323-1224", 9));
        pq.offer(new Patient("Kallee", "Karlssonn", "85503622-1213", 3));

        System.out.println(pq.toString());
    }

    }

输出

[KalleKarlsson8503622-12133, KalleeKarlssonn85503622-12133, LenaNilsson820323-12249, LisaSvensson840312-12247]

2 个答案:

答案 0 :(得分:3)

equals()方法用于比较类的两个实例是否相等。它来自Object类java。 java中的所有类都有equals()方法可供比较。您始终可以根据类成员和等式定义提供自定义实现。

Collections框架主要使用compareTo()来排序数组或对优先级队列中的元素进行排序。 compareTo()来自Comparable界面。

public int compareTo(Patient rhs) {
    if(prio==rhs.prio) {
        return number - rhs.number; // First line
    } else {
        return prio - rhs.prio; // Second line
    }
 }

compareTo()方法是根据类的numberprio属性定义的。当前实例较小然后分别通过,等于或更大时,compareTo()返回负数,零或正数。

public boolean equals(Object rhs) {
    if (rhs instanceof Patient) {  // First Line
      return compareTo((Patient) rhs) == 0; // Second Line
    } else {
      return false;
    }
 }

在第一行中,您正在检查传递给method的参数是Patient类的实例。因为您正在检查两个实例应该是相同类型的相等性。

第二行,您正在使用compareTo()方法来定义实例的相等性。

问题更新:

以下是toString()方法。

@Override
public String toString() {
  return
      "firstname='" + firstname  +
      " lastname='" + lastname +
      " personNbr='" + personNbr +
      " prio=" + prio +
      " number=" + number;
}

您需要poll()而不是仅打印它们。 poll()检索并删除此队列的头部。这将代表队列中元素的真实顺序,而不是toString()

while (!pq.isEmpty()) {
  System.out.println(pq.poll());
}

输出:

firstname='Kalle lastname='Karlsson personNbr='8503622-1213 prio=3 number=1
firstname='Kallee lastname='Karlssonn personNbr='85503622-1213 prio=3 number=4
firstname='Lisa lastname='Svensson personNbr='840312-1224 prio=7 number=2
firstname='Lena lastname='Nilsson personNbr='820323-1224 prio=9 number=3

分析:

KalleKallee具有最高优先级(最低值),但number的{​​{1}}低于Kalle。其他人由Kallee组织。

答案 1 :(得分:0)

conmpareTo方法定义了一个排序,以便首先排序prio字段,然后排序number字段。如果prio字段相等,则差异来自number字段。如果prio不相等,那么它就是被比较的prio字段。

equals方法声明如果compareTo返回零,则两个对象相等 - 如果您考虑它,这是有意义的。