千峰Java教程:051. 对象数组案例②【第四章完结】

书接上文

废话不多说,看代码

import java.util.Arrays;
 
public class a
{
	public static void main(String[] args)
	{
		System.out.println("-------------add--------------");
		ChickenManager chicken = new ChickenManager(-3);
		
		chicken.add(new Chicken(1, "老一", 3));
		chicken.add(new Chicken(2, "老二", 2));
		chicken.add(new Chicken(3, "老三", 3));
		chicken.add(new Chicken(4, "老四", 5));
		chicken.add(new Chicken(5, "老五", 1));
		chicken.add(new Chicken(6, "老六", 1));
		
		System.out.println(chicken.length());
		
		System.out.println("-------------print--------------");
		chicken.printAll();
		
		System.out.println("-------------find--------------");
		Chicken c = chicken.find(3);//比如要找的是3号鸡
		c.print();
		
		System.out.println("-------------update--------------");
		Chicken newChicken = new Chicken(1, "老凌", 6);
		chicken.update(newChicken);
		Chicken cc = chicken.find(1);//比如要找的是1号鸡
		cc.print();
		
		System.out.println("-------------delete--------------");
		chicken.delete(3);
		chicken.printAll();
	}
}
 
//小鸡类(数据对象)
class Chicken
{
	private int id;
	private String name;
	private int age;
	public Chicken(){}
	public Chicken(int id, String name, int age)
	{
		this.id = id;	//编号
		this.name = name;	//名字
		this.age = age;	//年龄(以月为单位)
	}
	public void setId(int id)
	{
		this.id = id;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
	public int getId()
	{
		return id;
	}
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
	public void print()
	{
		System.out.println("id = " + id + "	name = " + name + "	age = " + age);
	}
}
 
//小鸡管理类
class ChickenManager
{
	private Chicken[] chicken = null;	//首先定义一个空鸡窝
	
	private int count = 0;	//记录当前数组的元素个数(也是下标)
	
	public ChickenManager(int size)	//定义鸡窝大小
	{
		if(size <= 0)
		{
			chicken = new Chicken[5];	//如果输入一个负数,则我们定义一个鸡窝大小为5
		}
		else
		{
			chicken = new Chicken[size];
		}
	}
	
	public int length()
	{
		return chicken.length;
	}
	
	//添加(里面实现了动态数组)
	public void add(Chicken c)
	{
		if(count >= chicken.length)
		{//这时候鸡窝已满,需要扩建
			//扩建方法1:扩建到原数组长度的1.5倍:a.length * 3 / 2 + 1
			//扩建方法2:扩建到源数组长度的2倍:a.length * 2
			//我们用第二种方法
			int newLen = chicken.length * 2;
			chicken = Arrays.copyOf(chicken, newLen);
		}
		//然后下面扩不扩充都要添加
		chicken[count] = c;
		count++;
		
	}
	
	//删除:根据ID号来删除小鸡
	public void delete(int id)
	{
		/*数组删除小鸡:如果下标从0~7,8个鸡窝,要是删除下标为5的6号鸡窝,需要把6、7下标往前移动一位,
		如:下标:0 1 2 3 4 5 6 7,删除下标5,则变成0 1 2 3 4   6 7,5消失,再把6、7往左移:0 1 2 3 4 6 7,
		这个时候,count需要--*/
		for(int i = 0; i < count; i++)//首先找到这个ID
		{
			if(chicken[i].getId() == id)//找到了ID
			{
				for(int j = i; j < count-1; j++)//定义j等于i,此时i就是要删除的下标,这时候count是接着要加入的Chicken c,所以应小于count-1
				{
					chicken[j] = chicken[j+1];把后面那个鸡窝放进前面那个鸡窝
				}
				chicken[count-1] = null;//最后一个设为空
				count--;//总数减减
				break;
			}
		}
	}
	
	//更改小鸡(姓名、年龄),所以要给此方法一个ID
	public void update(Chicken c)//新封装一个鸡
	{
		Chicken temp = find(c.getId());//把新封装c的ID拿过来,先找到这只鸡的名字年龄,用temp接受
		if(temp != null)//如果找到这只鸡,直接修改名字和年龄
		{
			temp.setName(c.getName());
			temp.setAge(c.getAge());
		}
	}
	
	//查找
	public Chicken find(int id)
	{
		boolean bool = true;
		for(int i = 0; i < count; i++)//这里查找鸡的时候,鸡的总数不是a.length,而是counrt
		{
			if(chicken[i].getId() == id)
			{
				bool = false;
				return chicken[i];//找到了,返回id
			}
		}
		return null;//找不到,返回空
	}
	
	//输出所有
	public void printAll()
	{
		for(int i = 0; i < count; i++)//应该使用count而不是length
		{
			chicken[i].print();
		}
	}
}
/*
结果:
-------------add--------------
10
-------------print--------------
id = 1	name = 老一	age = 3
id = 2	name = 老二	age = 2
id = 3	name = 老三	age = 3
id = 4	name = 老四	age = 5
id = 5	name = 老五	age = 1
id = 6	name = 老六	age = 1
-------------find--------------
id = 3	name = 老三	age = 3
-------------update--------------
id = 1	name = 老凌	age = 6
-------------delete--------------
id = 1	name = 老凌	age = 6
id = 2	name = 老二	age = 2
id = 4	name = 老四	age = 5
id = 5	name = 老五	age = 1
id = 6	name = 老六	age = 1
*/

这里面是用了动态数组:

1、数组是一种线性数据结构

2、数组不适合做删除插入操作,适合添加、查找、遍历

其实数组也是一个集合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值