商苑面馆:Java ArrayList

来自CloudWiki
跳转至: 导航搜索

在上一个实训中,我们学习了用对象数组构建商品仓库。

其实,实现一个东西的途径有很多。

在这个实训和下一个实训中,我们就利用Java集合的有关类,对我们的商品仓库进行重写。

体验同一个东西,不同的写法。'

项目结构

在做项目之前,将我们项目的文件结构调成如下所示:

新建一个包,取名entity ,实体的意思。

将原先编的Food等类移到entity包下面:点击右键 -> Move

Java6-19.png


问题引出

现在我们已经有了一种简单的数据存储结构--Java 数组,

但是Java 数组要求我们必须提前指定它的大小,且一经定义就不能修改

有没有什么更加灵活的数据存储容器?

答案:Java 集合。

Java 集合

集合

Java中的集合类:是一种工具类,

它和我们前一阶段接触的数组一样,都是程序中存放数据的容器,

能够存储任意数量的具有共同属性的对象。

但是集合和数组又有区别:

1)数组大小固定,存储数据类型单一(基本类型/引用类型);
2)集合大小可动态扩展,可存储各种类型的数据;

常用的集合主要有:List、Set和Queue这么几个大类。

ArrayList

ArrayList属于集合List中的一个类

ArrayList类支持可随需要而增长的动态数组。

ArrayList类对于使用索引取出元素有较高的效率,它可以使用索引来快速定位对象。

声明和创建ArrayList

下面我们新建一个测试类MainClass,并在测试类的main方法中建立了一个String类的ArrayList。:

通过测试类可以发现,ArrayList也有一般的增删查改功能

访问集合里的每个元素用lis.get(i);,获取集合的大小用lis.size()


import java.util.*;

/*本类对应实训: */
public class MainClass {
	
 
    public static void main(String[] args) {
    	 ArrayList<String> lis = new ArrayList<>();
         /*添加元素*/
         lis.add("tony");
         lis.add("tom");
         /*删除元素*/
         lis.remove(1);
         /*修改元素*/
         lis.set(2, "lucy");
        /*查找元素*/
         if(lis.contains("vivian")){
             System.out.println("包含此元素!");
         }
         else{
             System.out.println("该元素不存在!");
         }
         System.out.println("<ArrayList列表元素>:");
         for(int i=0;i<lis.size();i++){
             String result = (String)lis.get(i);
             System.out.println(result);
         }   
         
    }
}

此类为测试类,本实训完成后可将此类删去。

通过测试类可以发现,ArrayList和原先的对象数组类似,没有什么大的不同。

面馆实训

新建食物仓库类FoodDao2

现在,我们在原先的项目中,新建立一个类FoodDao2,表示食物仓库:这个类的成员变量只有一个——一个命名为n、成员类型为Food的ArrayList。我们用它来表示我们面馆里所有食物。


public class FoodDao2 {
    private ArrayList<Food> n;//食物数组
    
    
    public FoodDao2(ArrayList<Food> n ){
    	this.n = n;    	
    } 
   
    public static void main(String[] args) {
		// TODO Auto-generated method stub  	
        
        
    }

}

新建search方法和toString方法

在FoodDao2里面新建search方法和toString方法

search方法表示在类中寻找特定的商品

toString方法表示把整个仓库中的商品清单以字符串的形式展示出来。

这两个方法功能和上一个实训的同名方法相同,只不过具体实现换成了ArrayList.

   //按名称搜
    public Food search(String s){
    	for(int i=0;i<this.n.size();i++){
    		if(n.get(i).getName().equals(s)){
    			return n.get(i);//如果第i个元素的名称等于s,就返回它
    		}
    	}
    	return null;
    	//return new Noodle();
    }
 
    public String toString(){
    	String s="";
    	for(int i=0;i<n.size();i++){//遍历ArrayList中的每个元素
    		s += n.get(i).toString()+"\r\n";
    	}
    	return s;
    }
  

编写测试用的main方法

main方法的代码主要包含:

  • 数组初始化
  • 接收用户输入
  • 调用FoodDao的方法
public static void main(String[] args) {
		// TODO Auto-generated method stub
    	 
    	//数组初始化    
    	ArrayList<Food> al = new ArrayList<>();//新建一个数组列表
    	Food f1 = new Noodle("炸酱面",12.0,3,"不辣");
    	Food f2 =new Noodle("臊子面",14.0,2,"麻辣");
    	Food f3 = new Noodle("刀削面",10.0,5,"微辣");
    	al.add(f1);
    	al.add(f2);
    	al.add(f3);
    	
        FoodDao2  f = new FoodDao2(al);//用数组列表f初始化食物仓库f
        System.out.println(f.toString());//调用toString方法
        
        //接收用户输入
        Scanner scan = new Scanner(System.in);
        System.out.println("您想点什么餐品?");               
        String meal = scan.next();
        System.out.println("输入的数据为:" + meal);        
        
        //按名称搜索,调用search方法
        Food n01 = f.search(meal);
        if(n01 != null) {
           System.out.println("餐品详细信息为:"+n01.toString());
           System.out.println("请付钱!");
	    }else {
	    	System.out.println("对不起,我们店现在没有这种面");
	    }
        
        scan.close();
        
        
        
    }

运行结果

Java5-5.png

课下练习

思考题:

  • 利用所学ArrayList知识,仿照食物仓库FoodDao2的例子,如何为你的商城建立商品仓库***Dao2?
  • 利用所学ArrayList知识,仿照食物仓库FoodDao2的例子,如何为你的用户(User)建立用户数据库UserDao2?

完整代码

import java.util.*;

import entity.*;

public class FoodDao2 {
    //private Food[] n;//食物数组
    private ArrayList<Food> n;//食物数组
    
    public FoodDao2(ArrayList<Food> n ){
    	this.n = n;
    	
    }
    //按名称搜
    public Food search(String s){
    	for(int i=0;i<this.n.size();i++){
    		if(n.get(i).getName().equals(s)){
    			return n.get(i);
    		}
    	}
    	return null;
    	//return new Noodle();
    }
 
    public String toString(){
    	String s="";
    	for(int i=0;i<n.size();i++){
    		s += n.get(i).toString()+"\r\n";
    	}
    	return s;
    }
   
    public static void main(String[] args) {
		// TODO Auto-generated method stub
    	 
    	
    	//数组初始化    
    	ArrayList<Food> al = new ArrayList<>();//新建一个数组列表
    	Food f1 = new Noodle("炸酱面",12.0,3,"不辣");
    	Food f2 =new Noodle("臊子面",14.0,2,"麻辣");
    	//Food f2 = new Rice("牛肉盖浇饭",3,2);
    	Food f3 = new Noodle("刀削面",10.0,5,"微辣");
    	al.add(f1);
    	al.add(f2);
    	al.add(f3);
    	
        FoodDao2  f = new FoodDao2(al);//用数组列表f初始化食物仓库foodset
        System.out.println(f.toString());//调用toString方法
        
        //接收用户输入
        Scanner scan = new Scanner(System.in);
        System.out.println("您想点什么餐品?");               
        String meal = scan.next();
        System.out.println("输入的数据为:" + meal);        
        
        //按名称搜索,调用search方法
        Food n01 = f.search(meal);
        if(n01 != null) {
           System.out.println("餐品详细信息为:"+n01.toString());
           System.out.println("请付钱!");
	    }else {
	    	System.out.println("对不起,我们店现在没有这种面");
	    }
        
        scan.close();
        
        
    }

}