Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将列表与涉及布尔值的多个属性进行比较_Java_Sorting_Linked List_Boolean_Comparator - Fatal编程技术网

Java 将列表与涉及布尔值的多个属性进行比较

Java 将列表与涉及布尔值的多个属性进行比较,java,sorting,linked-list,boolean,comparator,Java,Sorting,Linked List,Boolean,Comparator,我有一些类实现了comparator接口,通过添加patient对象对ArrayList进行排序,我希望通过多个属性对列表进行排序,并且只使用枚举进行排序没有问题,但是我希望通过使用布尔值进行排序来覆盖此排序。我知道我不能使用compareTo方法,因为它不是包装类,但我无法找到合适的方法通过boolean对列表进行排序 任何帮助都将不胜感激 public Patient(int nhsNumber, String name, Status triage, boolean previou

我有一些类实现了comparator接口,通过添加patient对象对ArrayList进行排序,我希望通过多个属性对列表进行排序,并且只使用枚举进行排序没有问题,但是我希望通过使用布尔值进行排序来覆盖此排序。我知道我不能使用
compareTo
方法,因为它不是包装类,但我无法找到合适的方法通过
boolean
对列表进行排序

任何帮助都将不胜感激

    public Patient(int nhsNumber, String name, Status triage, boolean previouslyInQueue, boolean waitingTime){
    this.nhsNumber = nhsNumber;
    this.name = name;
    this.triage = triage;
    this.previouslyInQueue = previouslyInQueue;
    this.waitingTime = waitingTime;

}
这是我的比较器类

public class PatientInQueueComparator implements Comparator<Patient> {

@Override
public int compare(Patient p1, Patient p2) {

    if(p1.isPreviouslyInQueue() && !p2.isPreviouslyInQueue()){
        return 1;
        }else if(p1.isPreviouslyInQueue() && p2.isPreviouslyInQueue()){
        return -1;
        }
        return 0;
}
公共类PatientQueueComparator实现Comparator{
@凌驾
公共整数比较(患者p1、患者p2){
如果(p1.isPreviouslyInQueue()&&!p2.isPreviouslyInQueue()){
返回1;
}else if(p1.isPreviouslyInQueue()和&p2.isPreviouslyInQueue()){
返回-1;
}
返回0;
}
我的主要方法

List<Patient> queue = new ArrayList<Patient>();

queue.add(new Patient(1, "Bob", Status.URGENT, true, false)); //1st
queue.add(new Patient(2, "John", Status.EMERGENCY, false, false)); //5th
queue.add(new Patient(3, "Mary", Status.NON_URGENT, false, false)); //6th
queue.add(new Patient(4, "Luke", Status.SEMI_URGENT, false, true)); //4th
queue.add(new Patient(5, "Harry", Status.NON_URGENT, true, false)); //2nd
queue.add(new Patient(6, "Mark", Status.URGENT, false, true)); //3rd


System.out.println("*** Before sorting:");

for (Patient p1 : queue) {
    System.out.println(p1);
}

Collections.sort(queue, new PatientComparator( 
        new PatientInQueueComparator(),
        new PatientTriageComparator())
);

System.out.println("\n\n*** After sorting:");

for (Patient p1 : queue) {
    System.out.println(p1);
}
List queue=new ArrayList();
queue.add(新患者(1,“Bob”,Status.emergency,true,false));//第一个
queue.add(新患者(2,“John”,Status.EMERGENCY,false,false));//第五
queue.add(新患者(3,“Mary”,Status.NON_emergency,false,false));//6
queue.add(新患者(4,“Luke”,Status.SEMI_emergency,false,true));//第四
queue.add(新患者(5,“Harry”,Status.NON_emergency,true,false));//第二
queue.add(新患者(6,“标记”,Status.emergency,false,true));//第三
System.out.println(“***排序前:”);
用于(患者p1:队列){
系统输出打印LN(p1);
}
Collections.sort(队列、新患者比较器(
新的PatientQueueComparator(),
新的PatientTriageComparator())
);
System.out.println(“\n\n***排序后:”);
用于(患者p1:队列){
系统输出打印LN(p1);
}
病人比较仪

    private List<Comparator<Patient>> listComparators;

 @SafeVarargs
    public PatientComparator(Comparator<Patient>... comparators) {
        this.listComparators = Arrays.asList(comparators);
    }

@Override
public int compare(Patient p1, Patient p2) {
    for (Comparator<Patient> comparator : listComparators) {
        int result = comparator.compare(p1, p2);
        if (result != 0) {
            return result;
        }
    }
    return 0;
}
私有列表比较器;
@安全变量
公共患者比较器(比较器…比较器){
this.listparators=Arrays.asList(comparators);
}
@凌驾
公共整数比较(患者p1、患者p2){
for(比较器比较器:列表比较器){
int结果=比较器。比较(p1,p2);
如果(结果!=0){
返回结果;
}
}
返回0;
}

您只需要在
compare
方法中实现适当的逻辑

@Override
public int compare(Patient p1, Patient p2) {

    if(p1.isPreviouslyInQueue() && !p2.isPreviouslyInQueue()){
        return 1;
        }else if(p1.isPreviouslyInQueue() && p2.isPreviouslyInQueue()){
        return -1;
        }
        //instead of returning zero here, sort by your next criteria
   }

如果希望
true
值大于
false
,则必须进行更正 您的
compare()
方法:

@Override
public int compare(Patient p1, Patient p2) {

    if (p1.isPreviouslyInQueue() && !p2.isPreviouslyInQueue()) 
        return -1;
    if (!p1.isPreviouslyInQueue() && p2.isPreviouslyInQueue()) 
        return 1;
    return 0;
}
如果,请注意第二个
。另一个实现可能是:

@Override
public int compare(Patient p1, Patient p2) {
    return ((Boolean)p2.isPreviouslyInQueue()).compareTo(p1.isPreviouslyInQueue());
}

不相关,但对链表排序不是一个好主意。如果要对它们进行排序,请使用数组列表。您所说的“要用布尔值覆盖排序”是什么意思?@fdsa抱歉,我的意思是先按布尔值排序,然后按triage@cg91似乎您需要
PriorityQueue
在这里。检查:我对java非常陌生,您有什么建议吗?当我期望John是Bob时,我似乎仍然把他排在队列的首位,还有什么我遗漏的吗?