java程序实例(接口+链表+模糊查询)

程序要求

实现一个宠物商店模型,一个宠物商店可以保存多个宠物信息(主要属性:名字,年龄),可以实现宠物的上架,下架,模糊查询功能

 程序分析

首先应该有一个宠物的标准,具体的宠物比如猫,狗应该去实例化宠物,所以:定义一个宠物的接口,具体的实例要去实现这个接口。接下来宠物商店和宠物的关系是一对多,也就是:一个宠物商店有多个宠物,至于具体的宠物会有增删改查的操作,所以应该选择链表去存储宠物这个抽象概念

 程序实现

 1:定义一个宠物的标准

interface Pet{
	public String getName();//得到宠物姓名
	public int getAge();//得到宠物年龄
}

2:定义宠物商店

宠物商店并不关心具体的宠物是什么,它只在乎对宠物可以进行操作。

class PetShop{
	private Link pets=new Link();//保存宠物信息(实例化)
	public void add(Pet pet) {//实现:上架功能
		this.pets.add(pet);
	}
	public void delete(Pet pet) {//实现:下架功能
		this.pets.remove(pet);
	}
	/*难点:模糊查询*/
	//由于:返回的一定是多个结果,所以返回Link即可
	public Link search(String keyword) {
		Link result=new Link();//result作为返回结果
		Object obj[]=this.pets.toArray();//真正返回的是具体实例化的getName()
		for(int x=0;x<obj.length;x++) {
			Pet p=(Pet) obj[x];//向下转型
			if(p.getName().contains(keyword)) {
				result.add(p);//保存满足模糊查询的结果
			}
		}
		return result;
	}
}

3:实现接口

猫:

class Cat implements Pet{
	private String name;
	private int age;
	public Cat(String name,int age) {
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return this.name;
	}
	public int getAge() {
		return this.age;
	}
	/*Object的两个方法*/
	public String toString(){
		return "猫名:"+this.name+",猫年龄:"+this.age;
	}
	public boolean equals(Object obj) {
		if(this==obj) return true;
		if(obj==null) return false;
		if(!(obj instanceof Cat)) {
			Cat c=(Cat) obj;
			if(this.age==c.age&&this.name.equals(c.name)) {
				return true;
			}
		}
		return false;
	}
}

 狗:

class Dog implements Pet{
	private String name;
	private int age;
	public Dog(String name,int age) {
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return this.name;
	}
	public int getAge() {
		return this.age;
	}
	/*Object的两个方法*/
	public String toString(){
		return "狗名:"+this.name+",狗年龄:"+this.age;
	}
	public boolean equals(Object obj) {
		if(this==obj) return true;
		if(obj==null) return false;
		if(!(obj instanceof Dog)) {
			Dog c=(Dog) obj;
			if(this.age==c.age&&this.name.equals(c.name)) {
				return true;
			}
		}
		return false;
	}
}

4:主程序实现

public class transfer {
    public static void main(String[] args) {
    	PetShop shop=new PetShop();
    	shop.add(new Cat("狸花猫",3));
    	shop.add(new Cat("英短猫",7));
    	shop.add(new Cat("缅因猫",9));
    	shop.add(new Dog("哈士奇",13));
    	shop.add(new Dog("萨摩耶",8));
    	shop.add(new Dog("藏獒",5));
    	Link all=shop.search("哈");
    	Object obj[]=all.toArray();
    	for(int x=0;x<obj.length;x++) {
    		System.out.println(obj[x]);
    	}
    }
 }

输出结果:

完整程序

 (链表类:可以直接使用)

class Link{
	private class Node{//内部类Node
		private Object data;
		private Node next;
		public Node(Object data) {
			this.data=data;
		}
		public void addNode(Node newNode) {//增加节点
			if(this.next==null) {
				this.next=newNode;
			}
			else {
				this.next.addNode(newNode);
			}
		}
		public Object getNode(int index) {//查询节点
			if(Link.this.foot++==index) {
				return this.data;
			}
			else {
				return this.next.getNode(index);
			}
		}
		public void setNode(int index,Object data) {//修改节点
			if(Link.this.foot++==index) {
				this.data=data;
			}
			else {
				this.next.setNode(index, data);
			}
		}
		public boolean containsNode(Object data) {//判断指定节点是否存在
			if(data.equals(this.data)) 
				return true;
			else {
				if(this.next!=null) {
					return this.next.containsNode(data);
				}
				else {
					return false;
				}
			}}
		public void removeNode(Node pre,Object data) {//删除节点
			if(data.equals(this.data)) {
				pre.next=this.next;
			}
			else {
				this.next.removeNode(this, data);
			}
		}
		public void toArrayNode() {//访问数据
			Link.this.ret[Link.this.foot++]=this.data;
			if(this.next!=null) {
				this.next.toArrayNode();
			}
		}
		}
	
	private Node root;//根节点
	private int count=0;
	private int foot;
	private Object[] ret;
	public void add(Object data) {//增
		Node newNode=new Node(data);
		if(this.root==null) {
			this.root=newNode;
		}
		else {
			this.root.addNode(newNode);
		}
		this.count++;
	}
    public Object get(int index) {//查
    	if(this.count<index) return null;
    	this.foot=0;
    	return this.root.getNode(index);
    }
    public void set(int index,Object data) {//改
    	if(this.count<index) return;
    	this.foot=0;
    	this.root.setNode(index, data);
    }
    public boolean contains(Object data) {//判断存在与否
		if (data==null||this.root==null) {
			return false;
		}
		else {
			return this.root.containsNode(data);
		}
	}
    public void remove(Object data) {//删
    	if(this.contains(data)) {
    	if(data.equals(this.root.data)) {//Link直接处理根节点的删除
    		this.root=this.root.next;
    	}
    	else {
    		this.root.next.removeNode(this.root,data);
    	}
    	this.count--;
    }}
	public Object[] toArray(){
		if(this.root==null) {
			return null;
		}
		this.foot=0;
		this.ret=new Object[this.count];
		this.root.toArrayNode();
		return this.ret;
	}
	public int size() {
		return this.count;
	}
	}//链表类:直接用
interface Pet{
	public String getName();//得到宠物姓名
	public int getAge();//得到宠物年龄
}
class PetShop{
	private Link pets=new Link();//保存宠物信息(实例化)
	public void add(Pet pet) {//实现:上架功能
		this.pets.add(pet);
	}
	public void delete(Pet pet) {//实现:下架功能
		this.pets.remove(pet);
	}
	/*难点:模糊查询*/
	//由于:返回的一定是多个结果,所以返回Link即可
	public Link search(String keyword) {
		Link result=new Link();//result作为返回结果
		Object obj[]=this.pets.toArray();//真正返回的是具体实例化的getName()
		for(int x=0;x<obj.length;x++) {
			Pet p=(Pet) obj[x];//向下转型
			if(p.getName().contains(keyword)) {
				result.add(p);//保存满足模糊查询的结果
			}
		}
		return result;
	}
}
class Cat implements Pet{
	private String name;
	private int age;
	public Cat(String name,int age) {
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return this.name;
	}
	public int getAge() {
		return this.age;
	}
	/*Object的两个方法*/
	public String toString(){
		return "猫名:"+this.name+",猫年龄:"+this.age;
	}
	public boolean equals(Object obj) {
		if(this==obj) return true;
		if(obj==null) return false;
		if(!(obj instanceof Cat)) {
			Cat c=(Cat) obj;
			if(this.age==c.age&&this.name.equals(c.name)) {
				return true;
			}
		}
		return false;
	}
}
class Dog implements Pet{
	private String name;
	private int age;
	public Dog(String name,int age) {
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return this.name;
	}
	public int getAge() {
		return this.age;
	}
	/*Object的两个方法*/
	public String toString(){
		return "狗名:"+this.name+",狗年龄:"+this.age;
	}
	public boolean equals(Object obj) {
		if(this==obj) return true;
		if(obj==null) return false;
		if(!(obj instanceof Dog)) {
			Dog c=(Dog) obj;
			if(this.age==c.age&&this.name.equals(c.name)) {
				return true;
			}
		}
		return false;
	}
}
public class transfer {
    public static void main(String[] args) {
    	PetShop shop=new PetShop();
    	shop.add(new Cat("狸花猫",3));
    	shop.add(new Cat("英短猫",7));
    	shop.add(new Cat("缅因猫",9));
    	shop.add(new Dog("哈士奇",13));
    	shop.add(new Dog("萨摩耶",8));
    	shop.add(new Dog("藏獒",5));
    	Link all=shop.search("哈");
    	Object obj[]=all.toArray();
    	for(int x=0;x<obj.length;x++) {
    		System.out.println(obj[x]);
    	}
    }
 }

总结

一个停车场停放多辆车(轿车,自行车)
一个公园里面多种树木(松树,柏树)
接口的目的:不同实例化对象之间的解耦合。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录如下: ==================================== 实例1 HelloWorld 实例10 创建一个窗体 实例100 上传文件 实例11 按扭 实例12 复选框 实例13 复合下拉列表 实例14 下拉列表 实例15 选项卡 实例16 对话框 实例17 文件对话框 实例18 使用HTML语言 实例19 菜单 实例2 java流程控制 实例20 工具栏 实例21 内部窗体 实例22 分割一个面板 实例23 滑动杆 实例24 颜色过滤器 实例25 表格 实例26 基本图形绘制 实例27 绘制波图形 实例28 图片的处理 实例29 绘制指针时钟 实例3 数组数据操作 实例30 三围立方框 实例31 三围立方体 实例32 标准输入输出 实例33 读写文件(字节) 实例34 读写文件(字符操作) 实例35 获取文件信息 实例36 目录操作 实例37 读取随机文件 实例38 操作EXECL文件 实例39 生成PDF文件 实例4 矢量对象操作 实例40 压缩和解压文件 实例41 执行系统命令 实例42 获取计算机名称和IP地址 实例43 一对简单的服务器和客户端 实例44 多线程服务器 实例45 使用SMTP协议发送邮件 实例46 使用SMTP协议接收邮件 实例47 使用JAVAMAIL发送邮件 实例48 使用JAVAMAIL接收邮件 实例49 获取URL文本 实例5 哈希表和枚举器 实例50 一个简单的WEB服务器 实例51 数据报通讯:聊天吧 实例52 使用ODBC连接数据库 实例53 加载JDBC驱动 实例54 使用语句预处理 实例55 可滚动结果集 实例56 数据库元数据 实例57 结果集元数据 实例58 调用存储过程 实例59 事务处理 实例6 类的继承 实例60 继承THREAD 实例62 多线程 实例63 线程组群 实例64 线程间通讯 实例65 线程同步 实例66 线程控制 实例67 线程优先级 实例68 使用DOM解析XML 实例69 使用SAX解析XML 实例7 接口和抽象类 实例70 使用JDOM解析XML 实例71 使用JDOM操作XML 实例72 欢迎进入APPLET世界 实例73 传递参数 实例74 监测鼠标事件 实例75 监测键盘事件 实例76 在APPLET中使用SWING 实例77 应用JAR包 实例78 播放声音 实例79 一个简单的SERVLET 实例8 类的标识和访问控制 实例80 使用SERVLET获取客户表单 实例81 SERVLET读取COOKIE数据 实例82 SERVLET读取SESSION数据 实例83 一个简单的JSP 实例84 JSP处理表单提交 实例85 JSP连接数据库 实例86 JSP使用数据连接池 实例87 JSP+BEAN的应用 实例88 JSP+BEAN连接数据库 实例89 读取属性文件 实例9 异常的捕获和实现自己的异常类 实例90 上传文件 实例91 读取浏览器文件头 实例92 无状态会话EJB 实例93 有状态会话EJB 实例94 容器管理实体EJB 实例95 BEAN自管理实体EJB 实例96 消息驱动BEAN 实例97 简单的STRUTS 实例98 信息表单提交 实例99 连接数据库

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值