Change priorityQueue to max priorityqueue

后端 未结 17 1794
一整个雨季
一整个雨季 2020-12-04 05:13

I have priority queue in Java of Integers:

 PriorityQueue pq= new PriorityQueue();

When I call pq.poll(

相关标签:
17条回答
  • 2020-12-04 06:00

    You can try something like:

    PriorityQueue<Integer> pq = new PriorityQueue<>((x, y) -> -1 * Integer.compare(x, y));
    

    Which works for any other base comparison function you might have.

    0 讨论(0)
  • 2020-12-04 06:00

    Using lamda, just multiple the result with -1 to get max priority queue.

    PriorityQueue<> q = new PriorityQueue<Integer>(
                           (a,b) ->  -1 * Integer.compare(a, b)
                        );
    
    0 讨论(0)
  • 2020-12-04 06:01

    You can use lambda expression since Java 8.

    The following code will print 10, the larger.

    // There is overflow problem when using simple lambda as comparator, as pointed out by Фима Гирин.
    // PriorityQueue<Integer> pq = new PriorityQueue<>((x, y) -> y - x);
    
    PriorityQueue<Integer> pq =new PriorityQueue<>((x, y) -> Integer.compare(y, x));
    
    pq.add(10);
    pq.add(5);
    System.out.println(pq.peek());
    

    The lambda function will take two Integers as input parameters, subtract them from each other, and return the arithmetic result. The lambda function implements the Functional Interface, Comparator<T>. (This is used in place, as opposed to an anonymous class or a discrete implementation.)

    0 讨论(0)
  • 2020-12-04 06:07

    You can use MinMaxPriorityQueue (it's a part of the Guava library): here's the documentation. Instead of poll(), you need to call the pollLast() method.

    0 讨论(0)
  • 2020-12-04 06:10

    How about like this:

    PriorityQueue<Integer> queue = new PriorityQueue<>(10, Collections.reverseOrder());
    queue.offer(1);
    queue.offer(2);
    queue.offer(3);
    //...
    
    Integer val = null;
    while( (val = queue.poll()) != null) {
        System.out.println(val);
    }
    

    The Collections.reverseOrder() provides a Comparator that would sort the elements in the PriorityQueue in a the oposite order to their natural order in this case.

    0 讨论(0)
  • 2020-12-04 06:12

    Change PriorityQueue to MAX PriorityQueue Method 1 : Queue pq = new PriorityQueue<>(Collections.reverseOrder()); Method 2 : Queue pq1 = new PriorityQueue<>((a, b) -> b - a); Let's look at few Examples:

    public class Example1 {
        public static void main(String[] args) {
    
            List<Integer> ints = Arrays.asList(222, 555, 666, 333, 111, 888, 777, 444);
            Queue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
            pq.addAll(ints);
            System.out.println("Priority Queue => " + pq);
            System.out.println("Max element in the list => " + pq.peek());
            System.out.println("......................");
            // another way
            Queue<Integer> pq1 = new PriorityQueue<>((a, b) -> b - a);
            pq1.addAll(ints);
            System.out.println("Priority Queue => " + pq1);
            System.out.println("Max element in the list => " + pq1.peek());
            /* OUTPUT
              Priority Queue => [888, 444, 777, 333, 111, 555, 666, 222]
              Max element in the list => 888
              ......................
               Priority Queue => [888, 444, 777, 333, 111, 555, 666, 222]
               Max element in the list => 888
    
             */
    
    
        }
    }
    

    Let's take a famous interview Problem : Kth Largest Element in an Array using PriorityQueue

    public class KthLargestElement_1{
        public static void main(String[] args) {
    
            List<Integer> ints = Arrays.asList(222, 555, 666, 333, 111, 888, 777, 444);
            int k = 3;
            Queue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
            pq.addAll(ints);
            System.out.println("Priority Queue => " + pq);
            System.out.println("Max element in the list => " + pq.peek());
            while (--k > 0) {
                pq.poll();
            } // while
            System.out.println("Third largest => " + pq.peek());
    /*
     Priority Queue => [888, 444, 777, 333, 111, 555, 666, 222]
    Max element in the list => 888
    Third largest => 666
    
     */
        }
    }
    

    Another way :

    public class KthLargestElement_2 {
        public static void main(String[] args) {
            List<Integer> ints = Arrays.asList(222, 555, 666, 333, 111, 888, 777, 444);
            int k = 3;
    
            Queue<Integer> pq1 = new PriorityQueue<>((a, b) -> b - a);
            pq1.addAll(ints);
            System.out.println("Priority Queue => " + pq1);
            System.out.println("Max element in the list => " + pq1.peek());
            while (--k > 0) {
                pq1.poll();
            } // while
            System.out.println("Third largest => " + pq1.peek());
            /*
              Priority Queue => [888, 444, 777, 333, 111, 555, 666, 222] 
              Max element in the list => 888 
              Third largest => 666
    
             */
        }
    }
    

    As we can see, both are giving the same result.

    0 讨论(0)
提交回复
热议问题