【问题标题】:compare list with multiple attributes involving a boolean将列表与涉及布尔值的多个属性进行比较
【发布时间】:2015-06-30 05:48:16
【问题描述】:

我有一些实现比较器接口的类,通过添加患者对象对 ArrayList 进行排序,我想按多个属性对列表进行排序,并且只使用 Enums 排序没有问题,但是我想通过使用排序来覆盖这种排序布尔值。我知道我不能使用 compareTo 方法,因为它不是 Wrapper 类,但我无法找到合适的方法通过 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;
}

我的主要方法

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);
}

患者比较器

    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;
}

【问题讨论】:

  • 不相关但对链表进行排序不是一个好主意。如果您希望它们排序,请使用数组列表。
  • “想要用布尔值覆盖排序”是什么意思?
  • @fdsa 抱歉,我的意思是先按布尔值排序,然后按分类
  • @cg91 似乎你需要PriorityQueue 这里。签出:docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html

标签: java sorting linked-list boolean comparator


【解决方案1】:

如果您希望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;
}

通知第二个if。另一种实现可能是:

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

【讨论】:

  • 我是java新手,你有什么推荐的?
  • 当我期待它是 Bob 时,我似乎仍然将 John 排在我的队列顶部,我还缺少什么吗?
【解决方案2】:

您只需要在您的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
   }

【讨论】:

    猜你喜欢
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多