Trying to solve "The method sort(List<T>, Comparator<? super T>) in the type Collections is not applicable for the arguments"

Gabrielp :

I have an assignment where I have to sort patients based on emergency and if they have the same emergency level, then it's based on the order of arrival, but when I'm sorting, I'm getting an error saying "The method sort(List, Comparator) in the type Collections is not applicable for the arguments (List, Comparator)" Can anyone help? Below is all of my code:

import java.util.Comparator;
public class Patient implements Comparable<Patient> {
// attributes
private String name;
private int order; // order of arrival
private int emergency; // 1 is normal, 5 is life-and-death situation

// constructor
public Patient(int order, String name, int priority) {
    this.order = order;
    this.name = name;
    this.emergency = priority;
}

// getters and setters
public int getOrder() {
    return order;
}

public void setOrder(int order) {
    this.order = order;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getEmergency() {
    return emergency;
}

public void setEmergency(int emergency) {
    this.emergency = emergency;
}

public String toString() {
    return name;
}

@Override
public int compareTo(Patient patient) {
    // TODO Auto-generated method stub
    int total = 0;
    if (emergency < patient.emergency) {// compares patient emergency
        total = 1;
    } else if (emergency == patient.emergency) {
        if (order < patient.order) {// compares order of arrival in case emergencies are the same
            total = -1;
        } else if (order > patient.order) {
            total = 1;
        }
    } else if (emergency > patient.emergency) {
        total = -1;
    }
    return total;
}

public static class Comparators {
    public static final Comparator<Patient> EMERGENCY = (Patient p1, Patient p2) -> Integer.compare(p1.getEmergency(), p2.getEmergency());
    public static final Comparator<Patient> ORDER = (Patient p1, Patient p2) -> Integer.compare(p1.getOrder(), p2.getOrder());

}}




import java.util.*;
public class PatientManager{
private PriorityQueue<Patient> waitingList;

public PatientManager() {
    waitingList = new PriorityQueue<Patient>();
}

// Starter method
public void start() {
    String choice;
    Scanner in = new Scanner(System.in);
    String name;
    int emergency = 0;
    int order = 0;
    List<Object> list = null;
    Patient patient;
    System.out.println("-------------------------------");
    System.out.println("(1) New Patient.");
    System.out.println("(2) Next Patient.");
    System.out.println("(3) Waiting List.");
    System.out.println("(4) Exit.");
    System.out.println("-------------------------------");

    while (true) {
        //clear screen
        System.out.print("* Choose an item from the menu: ");
        choice = in.next();
        switch (choice) {
        case "1":
            System.out.print("Enter patient's name: ");
            name = in.next();
            System.out.print("Enter emergency [1 (low) to 5 (life-and-death)]: ");

            while (emergency < 1 || emergency > 5) {//testing for emergency and if any wrong values are given clears the scanner and tries again
                try {
                    emergency = in.nextInt();
                    if (emergency < 1 || emergency > 5)
                        System.out.print("(x) Wrong value. Try again: ");
                }
                catch (Exception e) {
                    System.out.print("(x) Wrong value. Try again: ");
                    in.next();
                }
            }
            order++;//Sets the number of the arrival.
            patient = new Patient(order, name, emergency);
            waitingList.add(patient);
            System.out.println("Patient added to the waiting list.");
            emergency = 0;//resetting value of emergency otherwise all patients will have the same one and loop will not run a second time
            Arrays.sort(waitingList.toArray());
            break;
        case "2":
            if (waitingList.isEmpty()) {
                System.out.println("No more patients.");
            } else {
                patient = waitingList.remove();
                System.out.println(patient.getName() + " is treated.");
            }
            break;
        case "3":
            if (waitingList.size() == 0) {
                System.out.println("No patients in the list.");
            } else {
                System.out.println("Waiting list includes:");
                list = new ArrayList<Object>(waitingList);
                Collections.sort(list, Patient.Comparators.EMERGENCY);
                for (int i=0;i<waitingList.size();i++) {
                    System.out.println("- " + list.get(i));
                }
            }
            break;
        case "4":
            System.out.println("Program terminated. Good bye!!");
            in.close();
            System.exit(0);
            break;
        // print list name and emergency
        default:
            System.out.println("(x) Wrong choice.");
            break;
        }
    }
}}
Joni :

The problem is that the list you're sorting has been declared as a list that can contain arbitrary objects. You can't apply a comparator of Patients to objects that might not be Patients.

To solve it, declare your list as a list of Patients:

List<Patient> list = new ArrayList<>(waitingList)

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=355642&siteId=1