day09——集合ArrayList

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,选择进入不同的功能。

  • 15
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值