Зачем мне Comparable для PriorityQueue? - PullRequest
0 голосов
/ 16 мая 2018

Я изучаю Queue Collection и не понимаю, зачем мне реализовывать Comparable интерфейс, если я использую PriorityQueue?Я использовал Comparable и Comparator интерфейс в пользовательской сортировке для массива / списка.Но почему мне нужно реализовать для PriorityQueue, когда я не хочу его сортировать ...

В приведенном ниже примере я вижу, что не могу добавить элемент в PriorityQueue, если нереализовать сопоставимый интерфейс.

И большое недоразумение для меня после того, как я запустил этот код, список не отсортирован по идентификатору?Я задаю этот вопрос, потому что вижу, что метод compareTo () переопределен, и я использую этот метод, когда хочу отсортировать список.

Я помню, что использовал этот код точно, когда выполнял пользовательскую сортировку списка.И список был отсортирован по идентификатору.Почему очередь не сортируется в этом случае?

Извините за мою грамматику английского языка.Любая обратная связь будет оценена!

import java.util.PriorityQueue;
import java.util.Queue;

    public class QueueExample {

        public static void main(String[] args) { 

            Queue<Book> queue = new PriorityQueue<>();

            //Creating Books  
            Book b1=new Book(121,"Let us C","Yashwant Kanetkar","BPB",8);  
            Book b2=new Book(233,"Operating System","Galvin","Wiley",6);  
            Book b3=new Book(101,"Data Communications & Networking","Forouzan","Mc Graw Hill",4); 
            Book b4=new Book(319,"Learn Java","Yanis Orhan","HEX",3);  
            Book b5=new Book(191,"Linux","Hadgy","Haman",7);  
            Book b6=new Book(287,"Python Programming","Tarzan","GEN",5); 

            //Adding Books to the queue  
            queue.add(b1);  
            queue.add(b2);  
            queue.add(b3);  
            queue.add(b4);  
            queue.add(b5);  
            queue.add(b6); 

            System.out.println("Traversing the queue elements:");  

            //Traversing queue elements  
            for(Book b : queue) {  

                System.out.println(b.id+" "+b.name+" "+b.author+" "+b.publisher+" "+b.quantity);  
            }  

            queue.remove();  
            System.out.println("After removing one book record:");  
            for(Book b : queue) { 

                System.out.println(b.id + " " + b.name + " " + b.author + " " + b.publisher + " " + b.quantity);  
            }  
        }  
    }

Книга

public class Book implements Comparable<Book> {

    int id;  
    String name,author,publisher;  
    int quantity;  

    public Book(int id, String name, String author, String publisher, int quantity) {

        this.id = id;  
        this.name = name;  
        this.author = author;  
        this.publisher = publisher;  
        this.quantity = quantity;  
    }

    @Override
    public int compareTo(Book b) {

        if(id > b.id) {  

            return 1;  
        } else if (id < b.id) {  

            return -1;  
        } else {  

            return 0;  
        }
    }    
}

Я вижу, что голова - это элемент с самым низким идентификатором, но после этого нет порядка.Почему очередь не сортируется по идентификатору?

Traversing the queue elements:
101 Data Communications & Networking Forouzan Mc Graw Hill 4
191 Linux Hadgy Haman 7
121 Let us C Yashwant Kanetkar BPB 8
319 Learn Java Yanis Orhan HEX 3
233 Operating System Galvin Wiley 6
287 Python Programming Tarzan GEN 5
After removing one book record:
121 Let us C Yashwant Kanetkar BPB 8
191 Linux Hadgy Haman 7
287 Python Programming Tarzan GEN 5
319 Learn Java Yanis Orhan HEX 3
233 Operating System Galvin Wiley 6

ОБНОВЛЕНИЕ

Если я создаю ArrayList и сортирую его с помощью того же метода compareTo (), и янапечатайте это с тем же самым для каждого цикла, список отсортирован, и это напечатано в этом порядке.

Код для ArrayList:

import java.util.ArrayList;
import java.util.Collections;

public class BookExample {

    public static void main(String args[]) {

            ArrayList<Book> bookList = new ArrayList<>();

            Book b1=new Book(121,"Let us C","Yashwant Kanetkar","BPB",8);  
            Book b2=new Book(233,"Operating System","Galvin","Wiley",6);  
            Book b3=new Book(101,"Data Communications & Networking","Forouzan","Mc Graw Hill",4); 
            Book b4=new Book(319,"Learn Java","Yanis Orhan","HEX",3);  
            Book b5=new Book(191,"Linux","Hadgy","Haman",7);  
            Book b6=new Book(287,"Python Programming","Tarzan","GEN",5); 

            bookList.add(b1);  
            bookList.add(b2);  
            bookList.add(b3);  
            bookList.add(b4);  
            bookList.add(b5);  
            bookList.add(b6); 

            Collections.sort(bookList);

            for (Book b : bookList) {

              System.out.println(b.id + ", " + b.name + ", " + b.author + ", " 
              + b.publisher + ", " + b.quantity);
            }
          }
}

Book

public class Book implements Comparable<Book> {

    int id;  
    String name, author, publisher;  
    int quantity;  

      public Book(int id, String name, String author, String publisher, int quantity) {

        this.id = id;
        this.name = name;
        this.author = author;  
        this.publisher = publisher;  
        this.quantity = quantity;  
      }


    public int compareTo(Book b) {

            if(id > b.id) {  

                return 1;  
            } else if (id < b.id) {  

                return -1;  
            } else {  

                return 0;  
            }
      }
}

Результат в консоли:

101, Data Communications & Networking, Forouzan, Mc Graw Hill, 4
121, Let us C, Yashwant Kanetkar, BPB, 8
191, Linux, Hadgy, Haman, 7
233, Operating System, Galvin, Wiley, 6
287, Python Programming, Tarzan, GEN, 5
319, Learn Java, Yanis Orhan, HEX, 3

Почему длякаждый цикл работает очень хорошо, когда я печатаю ArrayList, и он не работает, когда я пытаюсь напечатать PriorityQueue?

Ответы [ 4 ]

0 голосов
/ 16 мая 2018

PriorityQueue, как javadoc read

Неограниченная приоритетная очередь, основанная на куче приоритетов. Элементы очереди с приоритетами упорядочиваются в соответствии с их естественным порядком или компаратором, предоставляемым во время построения очереди, в зависимости от того, какой конструктор используется. Очередь приоритетов не разрешает нулевые элементы. Очередь приоритетов, основанная на естественном упорядочении, также не позволяет вставлять несопоставимые объекты (это может привести к ClassCastException).

Требуется способ сравнить ваш элемент, чтобы правильно расставить приоритеты для ваших элементов при добавлении нового элемента в очередь.

А чтобы распечатать очередь по порядку, вам нужно воспользоваться следующим предложением:

Если вам нужен упорядоченный обход, рассмотрите возможность использования Arrays.sort (pq.toArray ()).

P / S: Я думаю, вы просто хотите реализовать интерфейс Queue в java и внезапно перейти к PriorityQueue.

В этом случае ArrayDeque<> лучше всего соответствует вашим потребностям.

0 голосов
/ 16 мая 2018

Javadoc говорит :

Итератор, предоставленный в методе iterator (), имеет значение , не гарантирующее прохождение элементов очереди с приоритетами в любом конкретном порядке ,Если вам нужен упорядоченный обход, рассмотрите возможность использования Arrays.sort(pq.toArray()).

В результате вы не можете просто использовать цикл for(Book book: queue).

Вы можете скопировать во временный массив, как предложенов Javadoc, или (если вы не возражаете уничтожить очередь в процессе) обведите poll().

Я согласен, что это очень нелогично.Вероятно, они вообще не должны реализовывать Iterable ...

0 голосов
/ 16 мая 2018

A PriorityQueue предназначено для конкретной цели: чтобы вы могли выбрать элемент с наивысшим приоритетом из очереди независимо от порядка, в котором он был добавлен.Предоставленное вами сравнение используется только для определения «приоритета».Это не упорядоченная коллекция в смысле итерации по порядку.

Вы можете проверить это, удалив элементы по очереди и сравнив их.Вы обнаружите, что порядок, в котором они удаляются, определяется определенным вами сравнением.

0 голосов
/ 16 мая 2018

Разница между List и PriorityQueue заключается в том, что, хотя List сохраняет ваш элемент упорядоченным по вставке, PriorityQueue, с другой стороны, сохраняет ваш элемент упорядоченным по атрибуту, который вы хотели бы видеть в вашем случае (ID).Если вставляемые элементы нельзя сравнивать друг с другом, поведение PriorityQueue по умолчанию соответствует поведению списка.

...