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) 删除指定的元素中的第一个,删除成功返回trueSystem.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集合结合面向对象编程实现以上功能。
分析:
-
在外卖系统中,每一份菜都包含,菜品的编号、菜品的名称、菜品的原价、菜品的会员价、菜品的其他信息。那我们就可以定义一个菜品类(Food类),用来描述每一个菜品对象要封装那些数据。
-
接着再写一个菜品管理类(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,并返回缺少的idflag = false;index = id;return index;}}//如果编号不缺少,则往后继续生成if(flag){index = count + 1;}return index;}//判断集合foodList中对象是否存在和num一样的id,有返回true,否则返回falsepublic 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,选择进入不同的功能。