Java语言程序设计——篇十一(4)

news2025/1/16 14:44:42

在这里插入图片描述
在这里插入图片描述

       🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿

  • 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
    您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻

集合——Queue

  • Queue接口和Deque接口
  • ArrayDeque和LinkedList类
    • 实战演练
    • 实战演练
  • 集合转换
      • 综合实例

Queue接口和Deque接口

Queue接口是Collection的子接口,以先进先出(First-In-First-Out,FIFO)的方式排列其元素,称为队列(queue)。
在这里插入图片描述

  • Queue接口的常用方法(两组):
//操作失败抛出异常
boolean add(E e)
  E remove()
  E element()
//操作失败不抛出异常
  boolean offer(E e)
  E poll()
  E peek()
  • Deque接口实现双端队列,它支持从两端插入和删除元素,它同时实现了Stack和Queue的功能。
  • 基本操作方法,如下表所示。
操作类型队首元素操作队尾元素操作
插入元素addFirst(e) offerFirst(e)addLast(e) offerLast(e)
删除元素removeFirst() pollFirst()removeLast() pollLast()
返回元素getFirst() peekFirst()getLast() peekLast()

ArrayDeque和LinkedList类

  • ArrayDeque类和LinkedList类是Deque的实现类,前者是可变数组的实现,后者是线性链表的实现。
  • 可以使用增强的for循环和迭代器访问Deque的元素。

实战演练

例:ArrayDequeDemo.java

import java.util.*;
public class ArrayDequeDemo {
public static void main(String[] args) {
int[] elements = { 1, 2, 3, 0, 7, 8, 9 };
ArrayDeque<Integer> queue = new ArrayDeque<>();
queue.addFirst(5);   // 将元素5添加到队列queue中
// 将数组中的前三个元素添加到queue
for (int i = 0; i < 3; i++)
	  queue.addFirst(elements[i]);
// 将数组中的后三个元素添加到queue
for (int i = 4; i < 7; i++)
     queue.offerLast(elements[i]);
// 访问queue中的每个元素
for (Integer v : queue)
      System.out.print(v + "  ");
System.out.println("\nsize = " + queue.size());
}
}

在这里插入图片描述

  • 如果需要经常在线性表内添加或删除元素,使用LinkedList类实现的列表的效率较高。
  • LinkedList类的构造方法
  • ①public LinkedList( ):创建空的链表
  • ②public LinkedList(Collection c):用集合c中的元素创建一个链表
    【注意】创建LinkedList对象不需要指定初始容量
  • LinkList类同时实现了List接口和Queue接口。
              LinkedList类的常用方法
常用方法功能说明
public void addFirst(E e)将元素e插入到列表的开头
public void addLast(E e)将元素e添加到列表的末尾
public E getFirst( )返回列表中的第一个元素
public E getLast( )返回列表中的最后一个元素
public E removeFirst( )删除并返回列表中的第一个元素
public E removeLast( )删除并返回列表中的最后一个元素

实战演练

【例】利用LinkedList构造一个先进后出的栈。

import java.util.*;
class StringStack
{
  private LinkedList<String> ld=new LinkedList<String>();
  public void push(String name)
  {
    ld.addFirst(name);
  }
  public String pop()
  {
    return ld.removeFirst();
  }
  public boolean isEmpty()
  {
    return ld.isEmpty();
  }
}
public class LinkedListDemo{
  public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    StringStack stack=new StringStack();
    System.out.println("请输入数据(quit结束)");
    while(true)
    {
      String input=sc.next();
      if(input.equals("quit"))
        break;
      stack.push(input);
    }
    System.out.println("先进后出的顺序:");
    while(!stack.isEmpty())
      System.out.print(stack.pop()+"  ");
  }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

集合转换

1️⃣可将Collection转换成不同类型的集合。

public ArrayList(Collection c)
public HashSet(Collection c)
public LinkedList(Collection c)

2️⃣可将Queue对象转换成一个List。

Queue<String> queue = new LinkedList<>();
     queue.add("hello");
     queue.add("world");//hello,world
     List<String> myList = new ArrayList<>(queue);

3️⃣可将List对象转换成Set对象。

 Set<String> set = new HashSet<>(myList);//world,hello

综合实例

我们可以将Queue的示例复杂化一些,通过引入更多的功能和逻辑来展示Queue在实际应用中的潜力。该示例模拟了一个简单的银行客户队列系统,其中包括多个窗口(虽然在这个示例中我们主要关注一个队列),客户入队、出队以及查询队列状态等功能。

import java.util.LinkedList;  
import java.util.Queue;  
  
public class BankQueueSystem {  
  
    private Queue<Customer> queue = new LinkedList<>();  
  
    // 假设这是银行的一个客户类  
    static class Customer {  
        private String name;  
        private int ticketNumber; // 假设这是客户的排队号  
  
        public Customer(String name, int ticketNumber) {  
            this.name = name;  
            this.ticketNumber = ticketNumber;  
        }  
  
        @Override  
        public String toString() {  
            return "Customer{" +  
                    "name='" + name + '\'' +  
                    ", ticketNumber=" + ticketNumber +  
                    '}';  
        }  
    }  
  
    // 客户入队  
    public void enqueueCustomer( customer) {  
        synchronized (queue) {  
            // 在实际应用中,这里可能需要更复杂的逻辑来分配ticketNumber  
            queue.offer(customer);  
            System.out.println(customer.name + " 加入队列,当前位置:" + customer.ticketNumber);  
            // 注意:这里的ticketNumber只是为了示例,实际上在队列中通常不直接存储位置信息  
        }  
    }  
  
    // 客户出队(服务完成)  
    public Customer dequeue() {  
        synchronized (queue) {  
            if (queue.isEmpty()) {  
                System.out.println("队列为空,没有客户可以服务。");  
                return null;  
            }  
            Customer customer = queue.poll();  
            System.out.println(customer.name + " 离开队列,服务完成。");  
            return customer;  
        }  
    }  
  
    // 显示队列状态  
    public void showQueueStatus() {  
        synchronized (queue) {  
            if (queue.isEmpty()) {  
                System.out.println("队列为空。");  
            } else {  
                System.out.println("当前队列中的客户:");  
                for (Customer customer : queue) {  
                    System.out.println(customer);  
                }  
            }  
        }  
    }  
  
    public static void main(String[] args) {  
        BankQueueSystem bankQueue = new BankQueueSystem();  
  
        // 模拟客户入队  
        bankQueue.enqueue(new Customer("Alice", 1));  
        bankQueue.enqueue(new Customer("Bob", 2));  
        bankQueue.enqueue(new Customer("Charlie", 3));  
  
        // 显示队列状态  
        bankQueue.showQueueStatus();  
  
        // 模拟服务过程,客户出队  
        bankQueue.dequeue();  
        bankQueue.dequeue();  
  
        // 再次显示队列状态  
        bankQueue.showQueueStatus();  
  
        // 尝试出队一个不存在的客户(队列为空)  
        bankQueue.dequeue();  
    }  
}

在这个示例中,我们创建了一个BankQueueSystem类,它内部维护了一个Queue 来存储银行客户。我们定义了一个Customer内部类来表示客户,包含客户的名字和一个假设的排队号(ticketNumber),但在实际队列操作中,我们通常不直接在队列元素中存储位置信息,这里只是为了示例目的。

我们为BankQueueSystem类添加了三个方法:enqueue用于客户入队,dequeue用于客户出队(即服务完成),showQueueStatus用于显示当前队列的状态。在main方法中,我们模拟了客户的入队和出队过程,并展示了队列状态的变化。
博主用心写,读者点关注,互动传真情,知识不迷路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1977433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入解析 KMZ 文件的处理与可视化:从数据提取到地图展示项目实战

文章目录 1. KMZ 文件与 KML 文件简介1.1 KMZ 文件1.2 KML 文件 2. Python 环境配置与依赖安装3. 代码实现详解3.1 查找 KMZ 文件3.2 解压 KMZ 文件3.3 解析 KML 文件3.4 可视化 KMZ 数据 4. 项目实战4.1. 数据采集4.2. 项目完整代码 5. 项目运行与结果展示6. 总结与展望 在处理…

2007-2023年上市公司国内外专利申请获得情况数据

2007-2023年上市公司国内外专利申请获得情况数据 1、时间&#xff1a;2007-2023年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;证券代码、统计截止日期、报表类型、地区、申请类型编码、申请类型、专利&#xff08;件&#xff09;、发明专利&#xff08;件&#x…

动态路由协议基础

一、动态路由协议简介 动态路由协议:路由器用来计算和维护路由信息的协议;通俗的说,就算路由器用来学习路由的协议。 二、动态路由与静态路由的区别 静态路由动态路由路由表手工配置自动生成路由维护人工维护自动收敛资源消耗路由表生成不占网络资源路哟表生成占用网络资源…

学习Java的日子 Day59 学生管理系统 web1.0版本

Day59 学生管理系统 web1.0 1.项目需求 有两个角色&#xff0c;老师和学生&#xff0c;相同的功能提取到父类用户角色 2.数据库搭建 设计学生表 设计老师表 插入数据 (超级管理员) 设计学科表 3.项目搭建 处理基础页面&#xff0c;分包&#xff0c;实体类&#xff0c;导入数据…

微软AI业务最新营收数据情况(2024年7月)

Azure AI 年度经常性收入 (ARR)&#xff1a;达到50亿美元客户数量&#xff1a;60,000家平均客户价值 (ACV) 中位数&#xff1a;83,000美元同比增长率&#xff1a;达到了惊人的900% GitHub Copilot 年度经常性收入 (ARR)&#xff1a;达到3亿美元客户数量&#xff1a;77,000家…

每日两题8

买卖股票的最佳时机 III class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();int INF 0x3f3f3f3f;vector<vector<int>> f(n, vector<int>(3, -INF));auto g f;g[0][0] 0;f[0][0] -prices[0];for (int i 1; i…

Leetcode3227. 字符串元音游戏

Every day a Leetcode 题目来源&#xff1a;3227. 字符串元音游戏 解法1&#xff1a;博弈论 分类讨论&#xff1a; 如果 s 不包含任何元音&#xff0c;小红输。如果 s 包含奇数个元音&#xff0c;小红可以直接把整个 s 移除&#xff0c;小红赢。如果 s 包含正偶数个元音&am…

10.Redis类型SortedSet

介绍 Redis的SortedSet是一个可排序的set集合。与java的TreeSet有些类似&#xff0c;但底层数据结构却差别很大。 SortedSet中的每个元素都带有一个score属性&#xff0c;可以基于score属性对元素排序&#xff0c;底层实现是一个跳表SkipList加hash表。 特点 可排序 元素不…

“银狐”团伙再度出击:利用易语言远控木马实施钓鱼攻击

PART ONE 概述 自2023年上半年“银狐”工具被披露以来&#xff0c;涌现了多个使用该工具的黑产团伙。这些团伙主要针对国内的金融、教育、医疗、高新技术等企事业单位&#xff0c;集中向管理、财务、销售等从业人员发起攻击&#xff0c;窃取目标资金和隐私信息。该团伙惯用微信…

多旋翼+四光吊舱:5Kg负载无人机技术详解

多旋翼无人机是一种具有三个及以上旋翼轴的无人驾驶飞行器。它通过每个轴上的电动机转动&#xff0c;带动旋翼&#xff0c;从而产生升推力。旋翼的总距固定&#xff0c;不像一般直升机那样可变。通过改变不同旋翼之间的相对转速&#xff0c;可以控制飞行器的运行轨迹。多旋翼无…

Js在线Eval加密混淆及解密运行

具体请前往&#xff1a;Js在线Eval加密混淆及解密运行

自动打电话软件的效果怎么样?

​​使用这个系统&#xff0c;机器人自动拨打电话&#xff0c;真人录制的语音与客户对话&#xff0c;整个过程非常顺畅。而且系统可以每天外呼数千乃至数万通电话&#xff0c;是人工的5-10倍&#xff0c;这样就不需要招聘大量员工来外呼&#xff0c;只需要留下一些优秀的销售人…

动视封禁超过6.5万名《战区》和《MW3》作弊者

动视已经在《使命召唤&#xff1a;战区》和《使命召唤&#xff1a;现代战争3》中封禁了超过65000名玩家。这些封禁在过去的几小时内实施&#xff0c;清除了数千名在排名赛和非排名赛中“作弊和代练”的玩家。 Ricochet反作弊团队现已清理了《使命召唤&#xff1a;战地》和《现代…

【PyTorch】神经风格迁移项目

神经风格迁移中&#xff0c;取一个内容图像和一个风格图像&#xff0c;综合内容图像的内容和风格图像的艺术风格生成新的图像。 目录 准备数据 处理数据 神经风格迁移模型 加载预训练模型 定义损失函数 定义优化器 运行模型 准备数据 创建data文件夹&#xff0c;放入…

人工智能与大数据的融合:驱动未来的力量

人工智能与大数据的融合&#xff1a;驱动未来的力量 一、人工智能与大数据的概述二、人工智能与大数据在数据库中的融合三、实际应用案例四、未来发展方向总结 【纪录片】中国数据库前世今生 在数字化潮流席卷全球的今天&#xff0c;数据库作为IT技术领域的“活化石”&#xff…

16进制转换-系统架构师(三十九)

1、&#xff08;软件架构设计->构件与中间件技术->构件标准&#xff09;对象管理组织&#xff08;OMG&#xff09;基于CORBA基础设施定义了四种构件标准。其中&#xff0c;&#xff08;&#xff09;状态信息是构件自身而不是由容器维护的。 A实体构件 B加工构件 C服务…

C++中lambda使用mutable关键字详解

C中lambda使用mutable关键字详解 在《C初学者指南-5.标准库(第二部分)–更改元素算法》中&#xff0c;讲“generate”算法时有下面这段代码&#xff1a; auto gen [i0]() mutable { i 2; return i; }; std::vector<int> v; v.resize(7,0); generate(begin(v)1, begin…

(南京观海微电子)——LCD OTP(烧录)介绍

OTP OTP只是一种存储数据的器件&#xff0c;全写:ONETIMEPROGRAM。 OTP目的&#xff1a;提高产品的一致性 客户端的接口不支持和我们自己的产品IC之间通信&#xff0c;即不支持写初始化&#xff0c;所以产品的电学功能以及光学特性需要固化在IC中&#xff0c;所以需要我们来进行…

青甘环线游记|day(1)|兰州

出发 下午1点&#xff0c;登机。航班经停万州&#xff0c;再到兰州。下图为飞机上拍的照片&#xff0c;不知道为什么窗户上有结晶的东西&#xff08;&#xff1f;&#xff09; 在飞机上拍的航线图&#xff0c;但是有点模糊。飞机上有提供午餐。4点左右到达万州 在飞机上好像…

08 Redis Set类型操作与使用场景

Redis Set类型操作与使用场景 一、Set类型操作 ​ Redis的Set结构与Java中的HashSet类似&#xff0c;可以看做是一个value为null的HashMap。因为也是一个hash表&#xff0c;因此具备与HashSet类似的特征&#xff1a; ​ 无序 ​ 元素不可重复 ​ 查找快 ​ 支持交集、并集…