class Link{ //一个管理类,负责产生Node类对象 以及 根数据
private Node root;//根节点
private int count=0;//计数
private int foot;//给每个节点一个脚标
private Object[] retArray;//设置一个返回数据类型 这个数据可以同时被外部类和内部类同时访问
public void add(Object data){//关键点:增加对象时,直接将数据(可以换成对象),包装进Node类
Node newNode=new Node(data);
if(this.rootnull){ //如果根节点为空,那么就将对象赋值给根节点
this.root=newNode;
}else{ //如果不为空,那么就交由Node类去匹配引用关系
this.root.addNode(newNode);
}
this.count++;//每次增加一个对象 就计数一次
}
public void print(){ //输出 : 如果root不为空,那么交由Node类输出
if(this.root!=null){
this.root.printNode();
}
}
public int size(){
return this.count;
}
public boolean contains(Object data){ //查找数据的方法
if(datanull||this.rootnull){ //如果数据和根节点都为空,说明没有要查找的数据 返回 false
return false;
}
return this.root.containsNode(data); //如果不为空,那么就交由Node类去匹配数据
}
public boolean isEmpty(){
if(this.count0||this.rootnull){
System.out.println(“这是个空链表”);
return true;
}else{
System.out.println(“这不是空链表”);
return false;
}
}
public Object get(int index){//根据脚标取得相应数据
if(index>this.count){ //如果脚标大于链表长度,那么就结束方法调用
return null;
}
this.foot=0;//每次查询都从根节点查询
return this.root.getNode(index);//从Node类开始查询
}
//删除分两种情况 : 1 是根节点 2 非根节点
public void remove(Object data){//如果删除的数据刚好是根节点
if(this.contains(data)){//主要是判断数据是否存在
if(data.equals(this.root.data)){
this.root=this.root.next;
}else {//难点 :如果删除的不是根节点,那么就要把 删除节点的上一个节点的next指向 删除节点的下一个节点
//所以要传入 上一个节点 和 要查询的数据
this.root.next.removeNode(this.root,data);
//如果不是根节点,那么就要传入
//那么根节点就指向根节点的下一个节点
}
this.count–;
}
}
public void set(int index,Object data){//根据编号设置数据
if(index>this.count){
return ;
}
this.root.setNode(index,data);
}
public Object[] toArray(){ //返回数组的方法
if(this.rootnull){
return null;
}
this.retArray=new Object[this.count];
this.root.toArrayNode();//数据的处理交由Node类去执行
return this.retArray;//返回处理后的数组
}
//内部类======
private class Node{//内部类
private Object data;//Node中所要包装的数据
private Node next;//Node类中对象对下一个对象的关系引用
public Node(Object data){
this.data=data;
}
public Object getData(){
return this.data;
}
public void addNode(Node newNode){//由Node类匹配引用关系
/*重点:第一次调用:this=Link.root;
第二次调用:this=Link.root.next;
第三次调用:this.=Link.root.next;
*/
if(this.nextnull){ //如果 当前节点为空,那么就把数据给当前节点,
this.next=newNode;
}else{ //如果不为空,那么就看下一个节点
this.next.addNode(newNode);
}
}
public void printNode(){
/*重点:第一次调用:this=Link.root;
第二次调用:this=Link.root.next;
第三次调用:this.=Link.root.next;
*/
System.out.println(this.data); //打印当前对象的数据
if(this.next!=null){//如果当前对象的指向不为空,那么就递归继续输出
this.next.printNode();
}
}
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 Object getNode(int index){
if(Link.this.foot++index){//重点,加了Link 表示调用外部类的this,否则表示调用内部类的this
return this.data; //如果脚标与查询相同,那么就返回当前数据
}else {
return this.next.getNode(index);//如果当前节点不是要查询的,那么就继续往下查询
}
}
//此方法专门负责删除非根节点
public void removeNode(Node previous, Object data){ //previous指的是上一个节点
if(data.equals(this.data)){
previous.next=this.next;//如果是删除当前数据,那么就把当前的next 给到自己的上一个节点
}else{
this.next.removeNode(this,data);
}
}
public void setNode(int index,Object data){//交由Node类来设置数据
if(Link.this.foot++index){
this.data=data;
}else{
this.next.setNode(index,data);
}
}
public void toArrayNode(){//由Node类执行数据添加
Link.this.retArray[Link.this.foot++]=this.data; //将数据添加进数组
if(this.next!=null){
this.next.toArrayNode();
}
}
}
//=以上为内部类========
}
interface Pet{ //定义一个宠物类的标准 暂时以姓名 年龄
public abstract String getName();
public abstract int getAge();
}
class Petshop{ //一个宠物商店 有增加宠物 删除宠物 模糊查询等功能
private Link pets=new Link();//要操作Link类 必须要一个实例化对象才能调用Link类的方法
public void add(Pet pet){
this.pets.add(pet);
}
public void delete(Pet pet){
this.pets.remove(pet);
}
public void print(){
this.pets.print();
}
public Link seach(String keyWork){
if(keyWorknull){
return null;
}
Link result=new Link();
Object [] obj=this.pets.toArray();//将链表内容转成数组 然后逐一比较
for(int i=0;i<obj.length;i++){
Pet p=(Pet)obj[i];
if(p.getName().contains(keyWork)){
result.add§;
}
}
return result;
}
}
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;
}
public String toString(){
return “狗的名字:”+this.name+",狗的岁数:"+this.age;
}
public boolean equals(Object obj){
if(thisobj){
return true;
}
if(objnull){
return false;
}
if(! (this instanceof Dog)){
return false;
}
Dog dog=(Dog)obj;
if(this.name.equals(dog.name)&&this.agedog.age){
return true;
}
return false;
}
}
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;
}
public String toString(){
return “猫的名字:”+this.name+",猫的岁数:"+this.age;
}
public boolean equals(Object obj){
if(thisobj){
return true;
}
if(objnull){
return false;
}
if(! (this instanceof Cat)){
return false;
}
Cat cat=(Cat)obj;
if(this.name.equals(cat.name)&&this.agecat.age){
return true;
}
return false;
}
}
class Fish implements Pet{
private String name;
private int age;
public Fish(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public String toString(){
return “鱼的名字:”+this.name+",鱼的岁数:"+this.age;
}
public boolean equals(Object obj){
if(thisobj){
return true;
}
if(objnull){
return false;
}
if(! (this instanceof Fish)){
return false;
}
Fish f=(Fish)obj;
if(this.name.equals(f.name)&&this.agef.age){
return true;
}
return false;
}
}
public class Test_petshop{
public static void main(String[] args){
Petshop shop=new Petshop();
shop.add(new Cat(“波斯猫”,8));
shop.add(new Cat(“英短猫”,6));
shop.add(new Cat(“中华田园猫”,15));
shop.add(new Dog(“二狗子”,15));
shop.add(new Dog(“黑狗”,9));
shop.add(new Dog(“斑点狗”,5));
shop.add(new Fish(“金龙”,2));
shop.add(new Fish(“银龙”,5));
shop.add(new Fish(“鹦鹉鱼”,2));
shop.delete(new Dog(“黑狗”,9));
Link all=shop.seach(“猫”);
Object obj[]=all.toArray();
for(int i=0;i<obj.length;i++){
System.out.println(obj[i]);
}
shop.print();
}
}

宠物商店的删除问题,删除猫的时候没有问题,删除狗或鱼的时候就会出现 Cat cannot be cast to Dog相关推荐

  1. Eclipse+Java+Swing实现宠物商店管理系统

    Java+Swing实现宠物商店 一.系统介绍 二.系统展示 1.主界面 2.增加宠物 3.删除宠物 4.修改宠物 5.查询宠物 6.模块查询 三.系统实现 Cat.java Dog.java Mou ...

  2. vs2015 dynamicweb11-1 .NET PET SHOP宠物商店完整项目代码

    此练习为一个完整的项目代码,含有用户注册.用户登录.宠物商品列表.购物车.结算.个人信息更新等功能. 在项目根目录,先创建App_Themes文件夹,其内建立一个文件夹PetShop1,内含一个css ...

  3. Java 链表(宠物商店)

    范例:宠物商店 //宠物接口类 interface Pet {public abstract String getName();// 获取名字抽象方法public abstract int getAg ...

  4. 以太坊宠物商店 - 记录第一个Dapp

    背景 记录以前练习的第一个Dapp宠物商店,使用以太坊作为处理宠物收养的方式.该商店在特定时间可容纳16只宠物,并且他们已经拥有宠物数据库.所以我们做一个将以太坊地址与宠物相关联的dapp,官方提供了 ...

  5. [附源码]java毕业设计网上宠物商店

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  6. asp.net线上宠物商店系统

    论文阐述了线上宠物商店系统的开发过程,并对该系统的需求分析及系统需要实现的设计方法作了介绍.该系统的基本功能包括用户购买和管理员管理.用户购买系统包括商品查询,订单查询和商品订购:管理员系统包括管理员 ...

  7. 【实验室集训大作业】JDBC实现宠物商店

    宠物商店 前言 这次的寒假大作业宠物商店,我是通过Java和MySQL实现的,具体的操作在下文会给出详细说明! 另外,由于Java和MySQL都是寒假刚学的,然后这个项目是边学边做的,所以有些方法在学 ...

  8. [附源码]java毕业设计宠物商店管理系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  9. 《Kotlin从小白到大牛》第28章:项目实战1:开发PetStore宠物商店项目

    第28章 项目实战1:开发PetStore宠物商店项目 前面学习的Kotlin知识只有通过项目贯穿起来,才能将书本中知识变成自己的.通过项目实战读者能够了解软件开发流程,了解所学知识在实际项目中使用的 ...

最新文章

  1. 同一个类 cannot be cast to_留学热门assignment之 税收筹划类essay
  2. AI一分钟 | 知乎融资2.7亿美元;腾讯投资特斯拉大赚特赚
  3. 能说明白为啥三次握手的文章节选
  4. python selenium 验证码识别_Python网络爬虫之如何用代码识别图片验证码
  5. python2和3语法区别_python2和3语法区别
  6. 【转】【Linux】sed命令详解
  7. Python字典操作
  8. “反催收”渐成黑灰产业 专家呼吁协同治理“债闹”黑灰产
  9. 洛谷 [POI2007]BIU-Offices 解题报告
  10. 【学术新闻】强强联合!Papers with Code携手arXiv,上传论文、提交代码一步到位...
  11. 基于BIND实现智能DNS解析
  12. 数学中的哈斯图如何构造?附实例
  13. 20道jQuery 常见的面试问题和答案
  14. springmvc原理+springmvc面试题
  15. 信息论与信道编码之BPSK误码率公式推导
  16. 什么是CSRF(跨站请求伪造)?
  17. 奥巴马演讲雷人文言文版
  18. vscode中6个好用的前端重构插件
  19. 2020网络安全NISP一级(模拟题五)
  20. 高等微积分:第3版修订版

热门文章

  1. 好好学习:外企日常英语
  2. 前端开发中处理csv数据,也许你可以试试这个方法
  3. MACE源码解析【GPU内存排布技巧】
  4. 手把手教你如何快速发表论文
  5. C语言实现三子棋游戏—可扩展到任意N子棋
  6. ROS2机器人笔记21-02-23
  7. 《NFL橄榄球》:辛辛那提猛虎·橄榄1号位
  8. JavaScript动态留言板设计
  9. Windows下Qt拔插U盘的检测方法
  10. iOS 十进制转换成十六进制