【发布时间】:2019-10-21 21:23:33
【问题描述】:
我在排序列表时遇到问题,我完成了给定练习中的所有任务,但这对我来说意义不大,我想修复它。所以我有一个在排队等候的人的名单,比方说,一家药房。怀孕的人应该优先于所有人,其次是年龄>60岁的人。一切正常,除了年龄大于 60 的人先来的人落后于年龄大于 60 的人(我只需要它与 FIFO 规则一起工作,怀孕标准按预期工作)。
我首先使用compareTo() 方法对列表进行排序,然后使用我创建的外部比较器类。
public class Main {
public static void main(String[] args) {
List<Customer> pharmacyQueue = new ArrayList<>();
CustomerComparator customerComparator = new CustomerComparator();
pharmacyQueue.add(new Customer(25, false, "Przemek"));
pharmacyQueue.add(new Customer(35, true, "Anita"));
pharmacyQueue.add(new Customer(55, false, "Wiesława"));
pharmacyQueue.add(new Customer(25, true, "Maryja"));
pharmacyQueue.add(new Customer(85, false, "Halinka"));
pharmacyQueue.add(new Customer(55, false, "Stasia"));
pharmacyQueue.add(new Customer(20, true, "Marta"));
pharmacyQueue.add(new Customer(65, false, "Bożenka"));
pharmacyQueue.add(new Customer(75, false, "Paoasdo"));
Collections.sort(pharmacyQueue);
Collections.sort(pharmacyQueue, customerComparator);
System.out.println("Sorted queue: ");
for (Customer c : pharmacyQueue){
System.out.println(c);
}
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Customer implements Comparable<Customer> {
private int age;
private boolean isPregnant;
private String name;
public int compareTo(Customer o) {
if (this.age > 60){
return -1;
}else if (this.age < 60){
return 1;
}
return 0;
}
public class CustomerComparator implements Comparator<Customer> {
@Override
public int compare(Customer o1, Customer o2) {
if (o1.isPregnant() && !o2.isPregnant()){
return -1;
}
if (o1.isPregnant() && o2.isPregnant()){
return 1;
}
return 0;
}
}
结果:
Sorted queue:
Customer(age=35, isPregnant=true, name=Anita) //fine
Customer(age=25, isPregnant=true, name=Maryja) //fine
Customer(age=20, isPregnant=true, name=Marta) //fine
Customer(age=75, isPregnant=false, name=Paoasdo) //should be 6th
Customer(age=65, isPregnant=false, name=Bożenka) //should be 5th
Customer(age=85, isPregnant=false, name=Halinka) //should be 4th
Customer(age=25, isPregnant=false, name=Przemek) //fine
Customer(age=55, isPregnant=false, name=Wiesława) //fine
Customer(age=55, isPregnant=false, name=Stasia) //fine
【问题讨论】:
-
我只看到打印了一个列表....
-
两次排序时,第2次会破坏第1次结果...
-
比较器总是自给自足的,为什么你认为比较器保持初始排序不变?
-
您的比较器都不正确。当机器人怀孕时,怀孕的比较器不应该返回 1,而是 0。当两者处于相同的年龄范围时,年龄比较器应该返回 0。当然,您需要将两种比较方法合二为一:首先按怀孕进行比较,然后如果结果为 0,则按年龄进行比较。使用组合比较器对列表进行一次排序。
-
无论何时编写比较器,都需要使其具有反射性(
x == x)、可交换性(如果x < y,则为y > x)和关联性(如果x < y和y < z,则x < z) - 见docs.oracle.com/javase/8/docs/api/java/util/…。
标签: java list sorting collections