「java、顺序队列」java队列排序

博主:adminadmin 2022-12-11 03:45:08 204

本篇文章给大家谈谈java、顺序队列,以及java队列排序对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

用java语言设计顺序循环队列类

代码如下:

import java.io.Serializable;

import java.util.Arrays;

public class LoopQueueT implements Serializable {

/**

 * @Fields serialVersionUID : TODO

 */

private static final long serialVersionUID = -3670496550272478781L;

private int DEFAULT_SIZE = 10;

private int capacity;// 保存数组的长度

private Object[] elementData;// 定义一个数组用于保存循环队列的元素

private int front = 0;// 队头

private int rear = 0;// 队尾

// 以默认数组长度创建空循环队列

public LoopQueue() {

capacity = DEFAULT_SIZE;

elementData = new Object[capacity];

}

// 以一个初始化元素来创建循环队列

public LoopQueue(T element) {

this();

elementData[0] = element;

rear++;

}

/**

 * 以指定长度的数组来创建循环队列

 * 

 * @param element

 *            指定循环队列中第一个元素

 * @param initSize

 *            指定循环队列底层数组的长度

 */

public LoopQueue(T element, int initSize) {

this.capacity = initSize;

elementData = new Object[capacity];

elementData[0] = element;

rear++;

}

// 获取循环队列的大小

public int size() {

if (isEmpty()) {

return 0;

}

return rear  front ? rear - front : capacity - (front - rear);

}

// 插入队列

public void add(T element) {

if (rear == front  elementData[front] != null) {

throw new IndexOutOfBoundsException("队列已满的异常");

}

elementData[rear++] = element;

// 如果rear已经到头,那就转头

rear = rear == capacity ? 0 : rear;

}

// 移除队列

public T remove() {

if (isEmpty()) {

throw new IndexOutOfBoundsException("空队列异常");

}

// 保留队列的rear端的元素的值

T oldValue = (T) elementData[front];

// 释放队列的rear端的元素

elementData[front++] = null;

// 如果front已经到头,那就转头

front = front == capacity ? 0 : front;

return oldValue;

}

// 返回队列顶元素,但不删除队列顶元素

public T element() {

if (isEmpty()) {

throw new IndexOutOfBoundsException("空队列异常");

}

return (T) elementData[front];

}

// 判断循环队列是否为空队列

public boolean isEmpty() {

// rear==front且rear处的元素为null

return rear == front  elementData[rear] == null;

}

// 清空循环队列

public void clear() {

// 将底层数组所有元素赋为null

Arrays.fill(elementData, null);

front = 0;

rear = 0;

}

public String toString() {

if (isEmpty()) {

return "[]";

} else {

// 如果front  rear,有效元素就是front到rear之间的元素

if (front  rear) {

StringBuilder sb = new StringBuilder("[");

for (int i = front; i  rear; i++) {

sb.append(elementData[i].toString() + ", ");

}

int len = sb.length();

return sb.delete(len - 2, len).append("]").toString();

}

// 如果front = rear,有效元素为front-capacity之间、0-front之间的

else {

StringBuilder sb = new StringBuilder("[");

for (int i = front; i  capacity; i++) {

sb.append(elementData[i].toString() + ", ");

}

for (int i = 0; i  rear; i++) {

sb.append(elementData[i].toString() + ", ");

}

int len = sb.length();

return sb.delete(len - 2, len).append("]").toString();

}

}

}

public static void main(String[] args) {

LoopQueueString queue = new LoopQueueString("aaaa", 3);

// 添加两个元素

queue.add("bbbb");

queue.add("cccc");

// 此时队列已满

System.out.println(queue);

// 删除一个元素后,队列可以再多加一个元素

queue.remove();

System.out.println("删除一个元素后的队列:" + queue);

// 再次添加一个元素,此时队列又满

queue.add("dddd");

System.out.println(queue);

System.out.println("队列满时的长度:" + queue.size());

// 删除一个元素后,队列可以再多加一个元素

queue.remove();

// 再次加入一个元素,此时队列又满

queue.add("eeee");

System.out.println(queue);

}

}

java中queue的使用方法?

java中的queue类是队列数据结构管理类。在它里边的元素可以按照添加它们的相同顺序被移除。

队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。无论使用哪种排序方式,队列的头都是调用remove()或poll()所移除的元素。在 FIFO 队列中,所有的新元素都插入队列的末尾。其他种类的队列可能使用不同的元素放置规则。每个Queue实现必须指定其顺序属性。

offer 添加一个元素并返回true 如果队列已满,则返回false

poll 移除并返问队列头部的元素 如果队列为空,则返回null

peek 返回队列头部的元素 如果队列为空,则返回null

put 添加一个元素 如果队列满,则阻塞

take 移除并返回队列头部的元素 如果队列为空,则阻塞

element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常

add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常

remove 移除并返回队列头部的元素 如果队列为空,则抛出一个

NoSuchElementException异常

注意:poll和peek方法出错进返回null。因此,向队列中插入null值是不合法的。

还有带超时的offer和poll方法重载,例如,下面的调用:

boolean success = q.offer(x,100,TimeUnit.MILLISECONDS);

尝试在100毫秒内向队列尾部插入一个元素。如果成功,立即返回true;否则,当到达超时进,返回false。同样地,调用:

Object head = q.poll(100, TimeUnit.MILLISECONDS);

如果在100毫秒内成功地移除了队列头元素,则立即返回头元素;否则在到达超时时,返回null。

阻塞操作有put和take。put方法在队列满时阻塞,take方法在队列空时阻塞。

Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。BlockingQueue 继承了Queue接口。

java 有序队列

好像线程池的调用是随机的,你要保证顺序的话,试试给加密线程传入一个类,这个类包含有序号信息,待加密信息,已加密信息。

class aa{

int number; // 序号,根据序号写出到文件。

byte[] a;// 待加密信息

byte[] b;// 信息加密过后写到这里。

}

如何用Java和Redis设计一个高效的先入先出的队列

分析:

redis的list底层是多个ziplist结构组成的“双向”链表。中间部分还压缩了一下。

最外层是由两个哈希表构成的dict。

哈希表的get(key)时间复杂度为O(1),而且这个O(1)理论上不会因为所占内存的大小和元素数目所改变。list的出队列和入队操作也都是O(1)。

Java的队列时间复杂度也应为O(1)。

可不可以直接用redis的list做先进先出?

情况1,数据数量不多,可以用

情况2,数据量多,但存的数据是激活码这样简单值一类,可以用。

情况3,list存的是要获取数据的索引,大量数据的值已经存在redis的KV结构中。

这时候,如果数据每次获取下一个数据都要执行redis的hash查找(O(1))然后redis的list从头或者末尾出一个。经过网络IO返回,Java程序在用出来的key去请求redis去get(key) (O(1))。这里是两次网络IO或者进程间的IO。

这时候,可以不用redis的list存索引而只是用redis大的KV哈希结构存键值。用①Java的队列先进先出获取下一个key或者②使用预先规定好的键生成的规则,让键是有规则有顺序的,比如自增ID,然后每次获取都是ID++,而直接从redis.get(ID.next());来获取值。

最后一种就是最高效的办法,为了特殊场景的高效出队列而设计。但是如果只是一般的数据量,使用redis的list也未尝不可。

什么是java优先级队列

楼主您好

PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(naturalorder)排序的。在创建的时候,可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。

java、顺序队列的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java队列排序、java、顺序队列的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-11,除非注明,否则均为首码项目网原创文章,转载请注明出处。