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集合结合面向对象编程实现以上功能。
分析:
-
在外卖系统中,每一份菜都包含,菜品的编号、菜品的名称、菜品的原价、菜品的会员价、菜品的其他信息。那我们就可以定义一个菜品类(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,并返回缺少的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,选择进入不同的功能。