Сортировка списка с использованием компаратора с несколькими критериями. ФИФО - PullRequest
1 голос
/ 06 июня 2019

У меня проблема с сортировкой списка, я выполнил все задачи, которые есть в данном упражнении, но мне это не совсем понятно, и я хочу это исправить.Итак, у меня есть Список людей, которые стоят в очереди, скажем, в аптеке.Беременные должны иметь приоритет над всеми, следующий приоритет - люди старше 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 ]

2 голосов
/ 06 июня 2019

Для этого вам необходимы две вещи:

  1. A алгоритм стабильной сортировки , то есть алгоритм, который не будет нарушать порядок «равно» (в терминах сортировкиorder) elements
    • Вам повезло, Collections.sort() гарантированно стабильно
  2. Компаратор, который правильно определяет, что это за элементы "равно "
    • Вот где оба ваших компаратора терпят неудачу - компаратор возраста даже никогда не использует информацию о другом объекте (!!!), а компаратор беременности имеет ошибку, которая считает, что две беременные женщины имеютдругой приоритет.
0 голосов
/ 06 июня 2019

Как указано в комментариях, сортировка списка дважды делает то же самое, что и сортировка только со вторым порядком (только медленнее).Да, и многие сорта, такие как QuickSort, нестабильны (переставляют связанные значения), тогда как другие, такие как MergeSort, стабильны.

Вы хотите объединить компараторы (или компаратор и сопоставимые).К счастью (начиная с версии 1.8) это очень просто с помощью этих двух методов в java.util.Comparator

static <T extends Comparable<? super T>> Comparator<T> naturalOrder()

default Comparator<T> thenComparing​(Comparator<? super T> other)

Правильное решение этой проблемы оставлено в качестве упражнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...