Java 使用PriorityQueue来进行数据的分类收集

Java 使用PriorityQueue来进行数据的分类收集

Java util包有一个队列接口,定义了队列接口,该接口有为队列中的方法定义的方法。队列的一般实现是元素的先入先出排序。该接口有许多方法,我们主要关注两个方法

  • poll() – 检索并删除该队列的头部,如果该队列为空,则返回null。
  • offer(element e) – 如果有可能在不违反容量限制的情况下立即插入指定的元素到这个队列中。

队列接口有许多实现。对于队列内的特殊排序,java引入了一个实现类Priority_Queue,允许队列内的排序为特殊类型。

Priority Queue

一个基于优先级堆的无界优先级队列。优先级队列的元素根据它们的自然排序,或者根据队列构造时提供的比较器进行排序,这取决于使用哪个构造器。一个优先级队列不允许有空元素。依靠自然排序的优先级队列也不允许插入不可比较的对象(这样做可能导致ClassCastException)。

在Java中使用PriorityQueue来进行数据的分类收集

使用优先队列对元素进行排序

让我们通过一些代码例子来了解如何使用优先级队列来按升序或降序排列元素。

1.在优先级队列中按升序排序的元素

一个比较器类允许我们定义元素在队列中的排序方式。为了对元素进行升序排序,我们需要对队列做如下定义。(为了简单起见,比较器被写成了一个扩展的形式)。

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
  
public class Application {
  
    public static void main(String[] args) {
        Comparator<Integer> ascendingOrderComparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 < o2)
                    return -1;
                if (o1 == o2)
                    return 0;
                return 1;
            }
        };
        Queue<Integer> priorityQueue = new PriorityQueue<>(ascendingOrderComparator);
  
        // insert elements in the queue
        priorityQueue.offer(5);
        priorityQueue.offer(100);
        priorityQueue.offer(1);
        priorityQueue.offer(2);
  
        // output
        while (!priorityQueue.isEmpty()) {
            System.out.print(priorityQueue.poll() + " ");
        }
    }
}

输出

1 2 5 100 

2.在优先级队列中按降序排序的元素

一个比较器类允许我们定义元素在队列中的排序方式。为了对元素进行降序排序,我们需要对队列做如下定义。(为了简单起见,比较器被写成了一个扩展的形式)。

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
  
public class Application {
  
    public static void main(String[] args) {
        Comparator<Integer> descendingOrderComparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 < o2)
                    return 1;
                if (o1 == o2)
                    return 0;
                return -1;
            }
        };
        Queue<Integer> priorityQueue = new PriorityQueue<>(descendingOrderComparator);
  
        // insert elements in the queue
        priorityQueue.offer(5);
        priorityQueue.offer(100);
        priorityQueue.offer(1);
        priorityQueue.offer(2);
  
        // output
        while (!priorityQueue.isEmpty()) {
            System.out.print(priorityQueue.poll() + " ");
        }
    }
}

输出

100 5 2 1 

3.使用优先级队列对一个对象集合进行排序

我们可以根据对象的某个字段对一个对象集合进行排序。让我们以Person类为例,它可以根据人的年龄以升序进行排序

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
  
public class Application {
    public static void main(String[] args) {
        Comparator<Person> ascendingOrderComparator = new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                if (o1.getAge() < o2.getAge())
                    return -1;
                if (o1.getAge() == o2.getAge())
                    return 0;
                return 1;
            }
        };
        Queue<Person> priorityQueue = new PriorityQueue<>(ascendingOrderComparator);
       
        // insert elements in the queue
        priorityQueue.offer(new Person("john", "doe", 5));
        priorityQueue.offer(new Person("karan", "agarwal", 100));
        priorityQueue.offer(new Person("anon", "test", 1));
        priorityQueue.offer(new Person("jien", "wang", 2));
          
        // output
        while (!priorityQueue.isEmpty()) {
            System.out.print(priorityQueue.poll() + " ");
        }
    }
}
  
class Person {
    private String firstName;
    private String lastName;
    private int age;
  
    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
  
    public int getAge() {
        return age;
    }
  
    @Override
    public String toString() {
        return "Person{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", age=" + age +
                '}';
    }
}

输出

Person{firstName='anon', lastName='test', age=1} 
Person{firstName='jien', lastName='wang', age=2} 
Person{firstName='john', lastName='doe', age=5} 
Person{firstName='karan', lastName='agarwal', age=100} 

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程