java集合类(六)About Queue
终于来到了java集合类的尾声,太兴奋了,不是因为可以休息一阵了,而是因为又到了开启新知识的时刻,大家一起加油打气!!Come on...Fighting!
- About “interface Queue<E>”
- All Superinterfaces:Collection<E>, Iterable<E>
- All Known Subinterfaces:BlockingDeque<E>, BlockingQueue<E>, Deque<E>, TransferQueue<E>
- All Known Implementing Classes:AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, LinkedTransferQueue, PriorityBlockingQueue, PriorityQueue, SynchronousQueue
- 先简要说明下队列:
- 之前,在“java集合类(三)About Iterator & Vector(Stack)”中讲到堆(heap)与栈(stack)的区别,现在讨论栈Stack与队列Queue的区别:
- 1)队列:FIFO先进先出,栈LIFO后进先出
- 2)队列:从队尾进对头出,栈:栈顶进栈顶出
- 3)遍历的速度不同:栈只能从栈顶取数,要得到最先入栈的元素,必须遍历这个栈,而且还需要开辟临时空间;队列则不同,它基于指针进行遍历,可以从对头或者队尾开始(不能同时),无需临时空间,遍历过程不影响数据结构,速度要快得多
- Queue的实现:在学习LinkedList的时候,我们已知道LinkedList实现了Queue接口,所以今天的Queue也可以用LinkedList实现,并且LinkedList还实现了Stack(java集合类(三)About Iterator & Vector(Stack)提到),所以我们也可以设想能不能用Stack实现Queue?答案是肯定的, 不过要用两个Stack才能实现! 现在来看一个Queue的基础例子:
- import java.util.LinkedList;
- import java.util.Queue;
- import java.util.Random;
- /**
- * @author jp
- *@date 2013-12-16
- */
- public class queuedemo {
- public static void printqueue(Queue queue) {
- while (queue.peek() != null) {
- System.out.print(queue.remove() + " ");
- }
- System.out.println();
- }
- public static void main(String[] args) {
- Queue<Integer> queue = new LinkedList<Integer>();
- Random random = new Random(32);
- for (int i = 0; i < 10; i++)
- queue.offer(random.nextInt(i + 10));
- printqueue(queue);
- Queue<Character> qCharacters = new LinkedList<Character>();
- for(char c: "GreatUniversity".toCharArray())
- qCharacters.offer(c);
- printqueue(qCharacters);
- }
- }
Output:
7 7 5 9 9 2 9 3 0 2
G r e a t U n i v e r s i t y
说明:关于Queue的操作
Throws exception |
Returns special value |
|
Insert | add(e) |
offer(e) |
Remove | remove() |
poll() |
Examine | element() |
peek() |
add()& offer():在队尾插入元素,成功则返回true,失败则返回false,并且可能会会抛出IllegalStateException等;但offer()不会抛出任何异常;
remove()& poll():移除并返回对头元素,但在队列为空时,pull()返回null,而remove()则抛出NoSuchElementException;
element() & peek():不移除并返回对头元素,但在队列为空时,peek()返回null,而element()则抛出NoSuchElementException;
- About PriorityQueue:PriorityQueue与Queue的最基本的区别在于,优先级队列PriorityQueue具有顺序性;通常PriorityQueue用offer()方法进行插入元素的时候,它的默认顺序是对象的自然顺序(数字小到大,字母按字母表),但程序员可以通过提供自己的Comparator修改默认排序,以确保在通过peek(),poll(),remove()等方法获取元素时,得到的是具有最高优先级的的元素。另外,在学习数据结构堆排序的时候,老师跟我们讲得一般都是基于大顶堆而不是小顶堆,因为一般小顶堆通常用来实现维持优先级队列。下面举例说明:
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.HashSet;
- import java.util.PriorityQueue;
- import java.util.Queue;
- import java.util.Random;
- import java.util.Set;
- /**
- * @author jp
- *@date 2013-12-16
- */
- public class priorityqueuedemo {
- public static void printqueue(Queue queue) {
- while (queue.peek() != null) {
- System.out.print(queue.remove() + " ");
- }
- System.out.println();
- }
- public static void main(String[] args) {
- PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>();
- Random random = new Random(32);
- for(int i = 0;i < 10; i++)
- priorityQueue.offer(random.nextInt(i + 10));
- printqueue(priorityQueue);
- java.util.List<Integer> list = Arrays.asList(12,14,15,16,17,18,19,20);
- priorityQueue = new PriorityQueue<Integer>(list);
- printqueue(priorityQueue);
- priorityQueue = new PriorityQueue<Integer>(list.size(), Collections.reverseOrder());
- priorityQueue.addAll(list);
- printqueue(priorityQueue);
- String string = "i have a great dream";
- Set<Character> charset = new HashSet<Character>();
- for (char c: string.toCharArray()) {
- charset.add(c);
- }
- PriorityQueue<Character> pCharacters = new PriorityQueue<Character>(charset);
- printqueue(pCharacters);
- }
- }
Output:
从最后一行可以看出:空格的优先级比一般的字母要高。下面看一个关于自己定义顺序,修改Comparator的例子:
- import java.util.*;
- class ToDoList extends PriorityQueue<ToDoList.ToDoItem> {
- static class ToDoItem implements Comparable<ToDoItem> {
- private char primary;
- private int secondary;
- private String item;
- public ToDoItem(String s, char c, int i) {
- primary = c;
- secondary = i;
- item = s;
- }
- /*
- * @see java.lang.Comparable#compareTo(java.lang.Object)
- * @implements Comparabale,then define the CompareTo()
- * @function firstly compare "key value",then "secondary value"(+1,0,-1)
- */
- public int compareTo(ToDoItem arg) {
- if(primary > arg.primary)
- return +1;
- if(primary == arg.primary)
- if(secondary > arg.secondary)
- return +1;
- else if(secondary == arg.secondary)
- return 0;
- return -1;
- }
- public String toString() {
- return Character.toString(primary) + secondary +": " + item;
- }
- }
- public void add(String s, char c, int i) {
- super.add(new ToDoItem(s, c, i));
- }
- public static void main(String[] args) {
- ToDoList toDoList = new ToDoList();
- toDoList.add("allen",'a',2);
- toDoList.add("jackson",'a',3);
- toDoList.add("davil",'b',3);
- toDoList.add("avily",'b',2);
- while (!toDoList.isEmpty()) {
- System.out.println(toDoList.remove());
- }
- }
- }
output:
a2: allen
a3: jackson
b2: avily
b3: davil
除了一般的Queue和PriorityQueue,还有一种叫做双端队列Deque,但它相对没那么常用,在此就不做相关介绍了,有兴趣的读者可以自行学习!
java集合类(六)About Queue的更多相关文章
- java集合类深入分析之Queue篇
简介 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约.实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现 ...
- java集合类深入分析之Queue篇(Q,DQ)
简介 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约.实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现 ...
- 基础知识《六》---Java集合类: Set、List、Map、Queue使用场景梳理
本文转载自LittleHann 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E6%8E%92%E5%BA%8F% ...
- Java集合类: Set、List、Map、Queue使用场景梳理
本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E ...
- Java集合类: Set、List、Map、Queue使用
目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...
- Java集合类: Set、List、Map、Queue使用场景
目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...
- Java集合类——Set、List、Map、Queue接口
目录 Java 集合类的基本概念 Java 集合类的层次关系 Java 集合类的应用场景 一. Java集合类的基本概念 在编程中,常需要集中存放多个数据,数组是一个很好的选择,但数组的长度需提前指定 ...
- java集合类(五)About Map
接上篇“java集合类(四)About Set” 这次学完Map之后,就剩队列的知识,之后有关java集合类的学习就将告一段落,之后可能会有java连接数据库,I/O,多线程,网络编程或Android ...
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
随机推荐
- Android中Json数据读取与创建
一: Json的特性和在数据交互中的地位就不用说了,直接看案例. 首先在android studio中创建assets文件目录,用于存放Json数据文件,android studio 1.3 默认项 ...
- 【学习笔记】【C语言】指针
一.指针变量的定义 1. 格式:变量类型 *指针变量名; 2. 举例:int *p; char *p2; 3. 注意:定义变量时的*仅仅是指针变量的象征 二.利用指针变量简单修改其他变量的值 1. ...
- C#颜色 转换
C#Winform 使用16进制颜色 var color = ColorTranslator.FromHtml("#eeeeee");
- linux命令后台运行[转]
有两种方式: 1. command & : 后台运行,你关掉终端会停止运行 2. nohup command & : 后台运行,你关掉终端也会继续运行 一. 简介 ...
- (转)每天一个linux命令(46):vmstat命令
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深 ...
- Android开发之切换activity动画overridePendingTransition
原文地址:http://blog.sina.com.cn/s/blog_706c449f01011s3v.html overridePendingTransition 在startActivity() ...
- Codevs 1669 运输装备
时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 德国放松对英国的进攻后,把矛头指向了东北—— ...
- 3月3日(4) Binary Tree Inorder Traversal
原题: Binary Tree Inorder Traversal 和 3月3日(2) Binary Tree Preorder Traversal 类似,只不过变成中序遍历,把前序遍历的代码拿出来, ...
- 【转】JavaScript里的this指针
用自然语言的角度理解JavaScript中的this关键字 <script type="text/javascript"> function ftn03(){ var ...
- webBrowser执行js的方法,并返回值,c#后台取值
private void Form1_Load(object sender, EventArgs e) { webBrowser1.Navigate(Application.StartupPath + ...