Java 将列表与涉及布尔值的多个属性进行比较
我有一些类实现了comparator接口,通过添加patient对象对ArrayList进行排序,我希望通过多个属性对列表进行排序,并且只使用枚举进行排序没有问题,但是我希望通过使用布尔值进行排序来覆盖此排序。我知道我不能使用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
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时,我似乎仍然把他排在队列的首位,还有什么我遗漏的吗?