day09——集合ArrayList

news2024/11/15 8:42:46

ArrayList类

ArrayList表示一种集合,它是一个容器,用来存储数据的,类似于数组。但不同于数组,数组一旦创建大小不变,而集合大小是可变的

ArrayList常用方法

ArrayList是泛型类,可以约束存储的数据类型,创建对象,调用无参数构造器初始化对象:public ArrayList();

想要使用ArrayList存储数据,并对数据进行操作:

第一步:创建ArrayList容器对象。一般使用空参数构造方法,如下图所示:

第二步:调用ArrayList类的常用方法对容器中的数据进行操作。常用方法如下:

public class Demo1 {
    public static void main(String[] args) {
        //1. public ArrayList<泛型>() 创建一个空的集合对象
        //  泛型:限定集合中装载数据的类型,(注意: 这里只能是引用类型)
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Java");
        list.add("我爱Java");
        System.out.println(list);//[Java, Java, 我爱Java]
​
        //3. public void add(int index,E element)   在此集合中的指定位置插入指定的元素(插队)
        list.add(1,"最好的编程语言之一");
        System.out.println(list);//[Java, 最好的编程语言之一, Java, 我爱Java]
        
        //4. public int size()  返回集合中的元素的个数
        System.out.println(list.size());//4
        
         //5. public E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
        list.set(1,"是一门好的编程语言");
        System.out.println(list);//[Java, 是一门好的编程语言, Java, 我爱Java]
        
        //6. public E get(int index)    返回指定索引处的元素
        System.out.println(list.get(3));//我爱Java
        
        //7. public E remove(int index) 删除指定索引处的元素,返回被删除的元素
        System.out.println(list.remove(1));//是一门好的编程语言
        System.out.println(list);//[Java, Java, 我爱Java]
​
        //8. public boolean remove(Object o)    删除指定的元素中的第一个,删除成功返回true
        System.out.println(list.remove("Java"));//true  默认删除的是第一次出现的"Java"
        System.out.println(list);//[Java, 我爱Java]
    }
​
}

删除特例

现在假如购物车中存储了如下这些商品:Java入门,宁夏枸杞,黑枸杞,人字拖,特级枸杞,枸杞子。 现在用户不想买枸杞了,选择了批量删除,请完成该需求。

实现方式:
    方式一:每次删除一个数据后,索引-1。
    方式二:从集合后面遍历然后删除,可以避免漏掉元素。
    
    1.用户可以选购多个商品,可以创建一个ArrayList集合,存储这些商品
    2.按照需求,如果用户选择了"枸杞"批量删除,应该删除包含"枸杞"的所有元素
        1)这时应该遍历集合中每一个String类型的元素
        2)使用String类的方法contains判断字符串中是否包含"枸杞"
        3)包含就把元素删除
    3.输出集合中的元素,看是否包含"枸杞"的元素全部删除
    
public class Demo{
    public static void main(String[] args) {
        //1. 创建一个ArrayList集合对象
        ArrayList<String> list = new ArrayList<>();
        list.add("Java入门");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("人字拖");
        list.add("特级枸杞");
        list.add("枸杞子");
        System.out.println(list);//[Java入门, 宁夏枸杞, 黑枸杞, 人字拖, 特级枸杞, 枸杞子]
​
       /* 方法1:
       //2.开始完成需求:从集合中找出包含枸杞的数据并删除它
        for (int i = 0; i < list.size(); i++) {
            // 取出当前遍历到的数据
            String s = list.get(i);
            // 判断这个数据中是否包含枸杞
            if (s.contains("枸杞")){
                //直接从集合中删除该数据
                list.remove(s);
                i--;
            }
        }
        System.out.println(list);
        */
​
        //方法2:
        for (int i = list.size()-1; i >= 0; i--) {
            // 取出当前遍历到的数据
            String s = list.get(i);
            // 判断这个数据中是否包含枸杞
            if (s.contains("枸杞")){
                //直接从集合中删除该数据
                list.remove(s);
            }
        }
        System.out.println(list);
    }
}

ArrayList应用案例

需求:模仿外卖系统中的商家系统,实现菜品的上架、下架、根据菜品编号查询菜品信息、根据菜品编号修改菜品信息、浏览全部菜品信息的功能。

要求:使用所学的ArrayList集合结合面向对象编程实现以上功能。

分析:

  1. 在外卖系统中,每一份菜都包含,菜品的编号、菜品的名称、菜品的原价、菜品的会员价、菜品的其他信息。那我们就可以定义一个菜品类(Food类),用来描述每一个菜品对象要封装那些数据。

  2. 接着再写一个菜品管理类(FoodManager类),实现菜品的上架、下架、根据菜品编号查询菜品信息、根据菜品编号修改菜品信息、浏览全部菜品信息的功能。

  • 首先我们先定义一个菜品类(Food类),用来描述每一个菜品对象要封装那些数据。

public class Food {
    //1.定义属性
    private int id;//编号
    private String name;//菜品的名称
    private double Price;//菜品的原价
    private String info;//菜品的其他信息
​
    //2.构造方法
​
    public Food() {
    }
​
    public Food(int id, String name, double price, String info) {
        this.id = id;
        this.name = name;
        Price = price;
        this.info = info;
    }
​
    //get/set
​
​
    public int getId() {
        return id;
    }
​
    public void setId(int id) {
        this.id = id;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public double getPrice() {
        return Price;
    }
​
    public void setPrice(double price) {
        Price = price;
    }
​
    public String getInfo() {
        return info;
    }
​
    public void setInfo(String info) {
        this.info = info;
    }
}
  • 接下来写一个菜品管理类,实现菜品的上架、下架、根据菜品编号查询菜品信息、根据菜品编号修改菜品信息、浏览全部菜品信息的功能。

public class FoodManager {
    //1.定义一个ArrayList集合的属性(模拟数据库,存放所有的菜品数据)
    private ArrayList<Food> foodList = new ArrayList<>();
    //为了在下面的多个方法中,能够使用键盘录入,提前把Scanner对象创建好;
    private Scanner sc = new Scanner(System.in);
​
    public FoodManager() {
        foodList.add(new Food(1,"鱼香豆腐",29.9,25.9,"甜辣口,嫩豆腐,招牌菜"));
        foodList.add(new Food(2,"尖椒🥩丝",38.9,33.9,"新鲜猪肉,自家种的新鲜蔬菜"));
        foodList.add(new Food(3,"麻婆豆腐",35.9,28.9,"香辣口,嫩豆腐,绝对好吃"));
        foodList.add(new Food(4,"蒜蓉大🦐",58.8,48.9,"新鲜活虾,色香味俱全"));
        foodList.add(new Food(5,"风味茄子",33.9,25.9,"自家种的新鲜蔬菜,本店招牌"));
        foodList.add(new Food(6,"红烧排骨",55.9,44.9,"新鲜猪肉,独家秘笈,保证好吃"));
    }
​
    //当前菜品数量
    int count = 6;
​
    //1.上架菜品(add)
    public void add(){
        System.out.println("====菜品上架====");
        //提前创建一个菜品对象,用于封装用户上架的菜品信息
        Food food = new Food();
        //添加时,菜品的id会根据已有的id进行判断,如果缺少,就补上,否则往后累加
        food.setId(getCount(count));
        System.out.println("请输入您想上架的菜品的名称:");
        food.setName(sc.next());
        System.out.println("请输入您想上架的菜品的原价:");
        food.setOriginalPrice(sc.nextDouble());
        System.out.println("请输入您想上架的菜品的会员价:");
        food.setMemberPrice(sc.nextDouble());
        System.out.println("请输入您想上架的菜品的信息:");
        food.setInfo(sc.next());
​
        //向菜单(集合)中添加菜品
        foodList.add(food);
        count++;//菜品加一
        System.out.println("恭喜您,菜品上架成功~~~");
    }
​
    //2.下架菜品(delete)
    public void deleteFoodById(int id){
        System.out.println("====菜品下架====");
        for (int i = 0; i < foodList.size(); i++) {
            Food foods = foodList.get(i);
            int foodsId = foods.getId();
            if (foodsId == id){
                foodList.remove(i);
                System.out.println("恭喜您,菜品下架成功~~~");
                count--;
                return;
            }
        }
        System.out.println("未找到该菜品,下架失败~~~");
    }
​
    //3.浏览全部菜品(query)
    public void queryAllFood(){
        System.out.println("====浏览全部菜品====");
        System.out.println("菜品的编号" + "     " + "菜品的名称" + "      " + "菜品的原价"
                + "     " + "菜品的会员价" + "       " + "菜品的信息");
        for (int i = 0; i < foodList.size(); i++) {
            Food foods = foodList.get(i);
            System.out.println("   " + foods.getId() + "          " + foods.getName() + "         "
                    + foods.getOriginalPrice() + "          " + foods.getMemberPrice() + "        " + foods.getInfo());
        }
    }
​
    //4.根据编号查询菜品(queryByID)
    public void queryFoodByID(int id){
        System.out.println("====根据编号查询菜品====");
        for (int i = 0; i < foodList.size(); i++) {
            Food foods = foodList.get(i);
            int foodsId = foods.getId();
            if(foodsId == id){
                System.out.println("菜品的编号" + "     " + "菜品的名称" + "      " + "菜品的原价"
                        + "     " + "菜品的会员价" + "       " + "菜品的信息");
                System.out.println("   " + foods.getId() + "          " + foods.getName() + "         "
                        + foods.getOriginalPrice() + "          " + foods.getMemberPrice() + "        " + foods.getInfo());
                return;
            }
        }
        System.out.println("不存在该菜品~~");
    }
​
    //5.根据编号修改菜品(updateByID)
    public void updateFoodById(Food food){
        System.out.println("====根据编号修改菜品====");
        int updateId = food.getId();
        for (int i = 0; i < foodList.size(); i++) {
            Food foods = foodList.get(i);
            int foodsId = foods.getId();
            if(foodsId == updateId){
                foodList.set(i,food);
                System.out.println("恭喜您,修改菜品成功~~~");
                return;
            }
        }
        System.out.println("未找到该菜品,修改失败~~~");
    }
​


    //生成菜品编号,判断编号从1截止到菜品中存在最大编号是否都与存在,是,则再生成新的编号,即最大编号+1,若编号有缺失,则补上缺失的编号
    //比如,有三个菜,理应有1,2,3三个编号,但是由于删除操作可能导致只剩下编号为1,3的菜品,则需要补上2号
    public int getCount(int count){
        count = getMax();
        int index = 0;
        boolean flag = true;
        //判断编号从1截止到菜品中存在最大编号是否都与存在
        for (int id = 1; id <= count; id++) {
            if(!exist(id)){
                //如果已有菜品id中有缺少编号,则令标记flag为false,并返回缺少的id
                flag = false;
                index = id;
                return index;
            }
        }
        //如果编号不缺少,则往后继续生成
        if(flag){
            index = count + 1;
        }
        return index;
    }


    //判断集合foodList中对象是否存在和num一样的id,有返回true,否则返回false
    public boolean exist(int num){
        for (int i = 0; i < foodList.size(); i++) {
            //获取集合中的每个对象
            Food food = foodList.get(i);
            //对象id与num比较
            if (food.getId() == num){
                return true;
            }
        }
        return false;
    }


    //获取对象id中的的最大id编号
    public int getMax(){
        int max = 1;
        for (int i = 0; i < foodList.size(); i++) {
            Food food = foodList.get(i);
            int foodId = food.getId();
            if(foodId > max){
                max = foodId;
            }
        }
        return max;
    }
​
}
  • 最后在写一个测试类FoodManagerTest,在测试类中进行测试。

public class FoodManagerTest {
    public static void main(String[] args) {
        FoodManager foodManager = new FoodManager();
        Scanner sc = new Scanner(System.in);
        while (true){
            System.out.println("====欢迎进入商家后台管理系统====");
            System.out.println("1.上架菜品(add)");
            System.out.println("2.下架菜品(delete)");
            System.out.println("3.浏览全部菜品(query)");
            System.out.println("4.根据编号查询菜品(queryByID)");
            System.out.println("5.根据编号修改菜品(updateByID)");
            System.out.println("6.退出系统(exit)");
            System.out.println("请您选择操作命令:");
​
            String choice = sc.next();
            switch (choice){
                case "add":
                    foodManager.add();
                    break;
                case "delete":
                    System.out.println("请输入您想下架的菜品id:");
                    int id = sc.nextInt();
                    foodManager.deleteFoodById(id);
                    break;
                case "query":
                    foodManager.queryAllFood();
                    break;
                case "queryByID":
                    System.out.println("请输入您想查询的菜品id:");
                    int id1 = sc.nextInt();
                    foodManager.queryFoodByID(id1);
                    break;
                case "updateByID":
                    Food food = new Food();
                    System.out.println("请输入您想修改的菜品的编号:");
                    food.setId(sc.nextInt());
                    System.out.println("请输入您想修改的菜品的名称:");
                    food.setName(sc.next());
                    System.out.println("请输入您想修改的菜品的原价:");
                    food.setOriginalPrice(sc.nextDouble());
                    System.out.println("请输入您想修改的菜品的会员价:");
                    food.setMemberPrice(sc.nextDouble());
                    System.out.println("请输入您想修改的菜品的信息:");
                    food.setInfo(sc.next());
                    foodManager.updateFoodById(food);
                    break;
                case "exit":
                    System.out.println("欢迎下次使用~~~");
                    return;
                default:
                    System.out.println("您输入的命令有误~~~~");
            }
        }
    }
}
  • 运行结果如下:需要用户输入add、delete、query、queryByID、updateByID或者exit,选择进入不同的功能。

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

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

相关文章

TLE8386-2EL:汽车级DC-DC转换器中文资料书

描述 TLE8386-2EL是一款具有内置保护功能的低端感应升压控制器。该器件的主要功能是将输入电压升高&#xff08;升压&#xff09;到更大的输出电压。开关频率可从100kHz调整至700kHz&#xff0c;并可与外部时钟源同步。 TLE8386-2EL的独特功能可将关断电流消耗降至 <2μA。该…

Python 如何进行静态代码分析(pylint, flake8)

Python 的静态代码分析是一种在不执行代码的情况下&#xff0c;对代码进行检查的技术。其主要目的是在代码运行前发现潜在的错误、风格问题以及其他代码质量问题。静态代码分析在提高代码的可维护性、可读性和可靠性方面发挥着重要作用。常用的静态代码分析工具包括 Pylint 和 …

观测云突变告警,精准预测云原生的系统异常

背景 观测云 DataKit 是一个强大的数据采集工具&#xff0c;能够收集和监控容器化环境和 Kubernetes 集群的指标、对象和日志数据。通过灵活使用 DataKit 收集的数据&#xff0c;可以对 Kubernetes 集群进行深入的监控和分析&#xff0c;从而实现更好的运维和优化。以下是一些…

如何使用yolov5-master进行训练

主要记录配置完成的yolov5-master如何进行自定义数据集训练。 本人使用的设备是jetson-orin AGX&#xff0c;系统是英伟达官方魔改过的ubuntu18.04.。 一、修改配置 首先观察train.py的__main__部分&#xff0c;我们发现训练程序接受很多个参数。 其中我们必须要关注的参数包括…

【网络编程】UDP实现网络通信(C语言、Ubuntu实现)

代码实现&#xff1a;分为udpSer.c(服务器端)和udpCli.c(客户端) //udpSer.c #include <myhead.h>#define SER_PORT 9999 #define SER_IP "192.168.83.128"int main(int argc, const char *argv[]) {//1、创建用于通信的服务器套接字文件描述符int sfd sock…

AI大模型学习之白话笔记(三) -- Assistants API入门

经过上面两篇文章的学习&#xff0c;恭喜你开始进入了人工智能的世界&#xff01;在这篇文章中&#xff0c;你将跟我一起学习如何使用Assistants API快速构建一个针对特定领域的人工智能助手。 我们从基础开始&#xff0c;一步步带你用Assistants API完成一个应用的整个过程。…

智能分析/视频汇聚EasyCVR安防视频融合管理云平台技术优势分析

安防行业的发展历程主要围绕视频监控技术的不断改革升级&#xff0c;从最初的模拟监控到数字监控&#xff0c;再到高清化、网络化监控&#xff0c;直至现在的智能化监控&#xff0c;每一次变革都推动了行业的快速发展。特别是近年来&#xff0c;随着AI、大数据、物联网等技术的…

Proxmox LXC 部署ubuntu,centos

前言CT 在 Proxmox VE 中,“CT”是 Container(容器)的缩写。PVE 支持两种主要类型的容器:LXC 和 OpenVZ(针对较旧的 Linux 内核)。这些容器提供了一种轻量级的虚拟化方式,允许用户在一个操作系统实例上运行多个隔离的系统环境。 PVE CT 特别是指在 Proxmox 平台上创建…

深入探索MySQL C API:使用C语言操作MySQL数据库

目录 引言 一. MySQL C API简介 二. MySQL C API核心函数 2.1 初始化和连接 2.2 配置和执行 2.3 处理结果 2.4 清理和关闭 2.5 错误处理 三. MySQL使用过程 四. 实现CRUD操作 4.1 创建数据库并建立表 ​编辑 4.2 添加数据&#xff08;Create&#xff09; ​编辑 …

idea git 重新登录

&#xff08;切换本地项目绑定的git账户&#xff09; git config --system --unset credential.helper git config user.name git pull &#xff08;然后输入用户名&#xff08;输绑定邮箱&#xff09;&#xff0c;密码&#xff09;

easyExcel2.1.6自动trim()的问题

环境&#xff1a;easyExcel 2.1.6 问题&#xff1a;easyExcel会自动忽略String中的空格&#xff0c;调用trim()函数&#xff0c;导致excel中的空格失效。 代码如上所示&#xff0c;所以只需要把globalConfiguration的autoTrim()&#xff0c;设置为false即可 那么怎么设置confi…

stable diffusion学习(1)成功打开WEBUI

建议学习github上的资源 GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 1.下载安装sd.webui.zip 1.1 Release v1.0.0-pre AUTOMATIC1111/stable-diffusion-webui GitHub 1.2安装python&#xff0c;设置阿里镜像 python -m pip config set gl…

Linux桥转发经过的netfilter钩子点

你是否也有这样的疑问&#xff0c;当我们路由器局域内的下挂设备&#xff0c;是怎么互相访问的呢。假设我的路由器当前的网段是192.168.1.1&#xff0c;有一台PC有线接入&#xff0c;IP地址为 192.168.1.142 &#xff0c;一台手机WiFi接入&#xff0c;IP地址为192.168.1.223&am…

FRTIMP_YTFRB_WEB

FRTIMP_YTFRB_WEB 林业资源交易信息管理平台

基于深度生物学引导辅助学习的多模态数据整合和插补来改进基因型-表型预测

DeepGAMI: deep biologically guided auxiliary learning for multimodal integration and imputation to improve genotype–phenotype prediction 代码&#xff1a;https://github.com/daifengwanglab/DeepGAMI abstract&#xff1a; background&#xff1a;基因型与疾病表…

【数据结构之C语言实现栈】

1.栈 的 概 念 与 结 构 栈&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据的插入和删除操作的一端称为栈顶&#xff0c;另一…

【代码随想录训练营第42期 Day26打卡 贪心Part1 - LeetCode 455.分发饼干 376. 摆动序列 53. 最大子序和

目录 一、贪心 二、题目与题解 题目一&#xff1a;455.分发饼干 题目链接 题解&#xff1a;排序双指针贪心 题目二&#xff1a;376. 摆动序列 题目链接 题解&#xff1a;贪心 题目三&#xff1a;53. 最大子序和 题目链接 题解1&#xff1a;暴力&#xff08;失败&…

立体相机镜面重建(二)双目立体镜面重建

使用双目相机&#xff0c;配合镜子、屏幕&#xff0c;可以直接获得镜面的三维数据&#xff0c;无需先验知识。因此使用双目镜面重建方式对镜子表面进行重建。 &#xff08;一&#xff09;重建步骤 使用左相机光线法来计算镜面点&#xff1a; 1.取一个像素点&#xff0c;计算其…

linux中安装达梦DM8

目录 场景&#xff1a; 安装准备 安装 新建 dmdba 用户 修改文件打开最大数 创建实例保存目录、归档保存目录、备份保存目录。 挂载镜像&#xff0c;命令行安装 ​编辑 配置环境变量 配置实例-命令行方式初始化实例 命令行注册服务 命令行启停数据库 数据库连接测试…

计算机网络部分基础知识

网络协议的意义 单台主机内部的设备之间需要发送和接收消息&#xff0c;那么和相隔很远的两台主机之间发送消息有什么区别呢&#xff1f;两台主机通过网络发送消息&#xff0c;相当于两个网卡设备之间进行通信&#xff0c;最大的区别在于距离变长了。而距离变长带来的结果就是&…