首页 > 分享 > 链表实战之宠物商店

链表实战之宠物商店

版权声明:

本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

简介: 本节结合在宠物商店出售各种宠物的实际情景,制定宠物、宠物店的标准并进行实现,结合链表实现对商店内宠物的动态数据操作。

上一篇:链表数据“暗杀记” | 带你学《Java面向对象编程》之九十四
【本节目标】
通过阅读本节内容,你将通过编码实现宠物商店的情景,进一步复习接口的相关知识,进一步掌握链表的结构与功能实现以及使用链表解决实际问题的能力。

综合实战:宠物商店

宠物商店:
现在假设一个宠物商店,里面可以出售各种宠物,要求可以实现宠物的上架,下架处理,也可以根据关键字查询宠物的信息。


图一 宠物设计实现

步骤:
1、应该定义出宠物的标准
2、定义宠物商店
3、根据宠物标准定义宠物信息(定义宠物猫、宠物狗)
4、实现宠物商店的操作

interface ILink<E> { //设置泛型避免安全隐患 public void add(E e) ; //增加数据 public int size() ; //获取数据的个数 public boolean isEmpty() ; //判断是否空集合 public Object[] toArray() ; //将集合元素以数组的形式返回 public E get(int index) ; //根据索引获取数据 public void set(int index,E data) ; //修改索引数据 public boolean contains(E data) ; //判断数据是否存在 public void remove(E e) ; //数据删除 public void clean() ; //清空集合 } class LinkImpl<E> implements ILink<E> { private class Node { //保存节点的数据关系 private E data ; //保存数据 private Node next ; //保存下一个引用 public Node(E data) { //有数据的情况下才有意义 this.data = data ; } //第一次调用:this = LinkImpl.root ; //第二次调用:this = LinkImpl.root.next ; //第三次调用:this = LinkImpl.root.next.next ; public void addNode(Node newNode){ //保存新的Node数据 if (this.next == null) { //当前节点的下一个节点为null this.next = newNode; //保存当前节点 }else { this.next.addNode(newNode); } } //第一次调用:this = LinkImpl.root //第二次调用:this = LinkImpl.root.next /第三次调用:this = LinkImpl.root.next.next public void toArrayNode() { LinkImpl.this.returnData [LinkImpl.this.foot ++] = this.data ; if (this.next != null) { //还有下一个数据 this.next.toArrayNode() ; } } public E getNode(int index) { if (LinkImpl.this.foot ++ == index) { //索引相同 return this.data ; //返回当前数据 }else { return this.next.getNode(index) ; } } public void setNode(int index,E data) { if (LinkImpl.this.foot ++ == index) { //索引相同 this.data = data ; //修改数据 }else { this.next.setNode(index,data) ; } } public boolean containsNode(E data) { if (data.equals(this.data)) { //对象比较 return true ; }else { if (this.next == null) { //没有后续节点 return false ; //找不到 }else { return this.next.containsNode(data) ; //向后继续判断 } } } public void removeNode(Node<E> previous,E date) { if (this.date.equals(date)) { previous.next = this.next ; }else { if (this.next!=null) { this.next.removeNode(this,date) ; } } } public void removeNode (Node previous,E data) { if (this.data.equals(data)) { previous.next = this.next ; //空出当前节点 }else { if (this.next != null) { //有后续节点 this.next.removeNode(this, data) ; //向后继续删除 } } } } //------------以下为Link类中定义的成员----------------- private Node root ; //保存根元素 private int count ; //保存数据的个数 private int foot ; //描述的是操作数组的脚标 private Object[] returnData ; //返回的数据保存 //------------以下为Link类中定义的方法----------------- public void add(E e){ if(e == null){ return ; } //数据本身是不具有关联特性的,只有Node类有,要想关联处理就必须将数据包装在Node类中 Node newNode = new Node(e); //创建一个新的节点 if (this.root == null){ //现在没有根节点 this.root = newNode; //第一个节点作为根节点 }else{ //根节点存在 this.root.addNode(newNode); //将新节点保存在合适的位置 } this.count++ ; } public int size() { return this.count ; } public boolean isEmpty() { //return this.root == null ; return this.count == 0 ; } public Object[] toArray() { if (this.isEmpty()) { //空集合 return null ; //现在没有数据 } this.foot = 0 ; //脚标清零 this.returnData = new Object[this.count] ; //根据已有的长度开辟数组 this.root.toArrayNode() ; //利用Node类进行递归数据获取 return this.returnData ; } public E get(int index) { if (index >= this.count) { //索引应该在指定的范围之内 return null ; } //索引数据的获取应该由Node类完成 this.foot = 0 ; //重置索引的下标 return this.root.getNode(index) ; } public void set(int index,E data) { if (index >= this.count) { //索引应该在指定的范围之内 return ; //方法结束 } //索引数据的获取应该由Node类完成 this.foot = 0 ; //重置索引的下标 this.root.setNode(index,data) ; //修改数据 } public boolean contains(E data) { if (data == null) { return false ; //没有数据 } return this.root.containsNode(data) ; //交给Node类判断 } public void remove(E data) { if (this.contains(data)) { //判断数据是否存在 if (this.root.data.equals(data)) { //根节点为要删除节点 this.root = this.root.next ; //根的下一个节点 }else { //交由Node类进行删除 this.root.next.removeNode(this.root , data) ; } this.count -- ; } } public void clean() { this.root = null ; //后续的所有节点都没了 this.count = 0 ; //个数清零 } } interface Pet{ //定义宠物标准 public String getName(); //获得名字 public String getColor(); //获得颜色 } class Petshop{ //宠物商店 private ILink<Pet> allPets = new LinkImpl<Pet>(); //保存多个宠物 public void add(Pet pet) { //追加宠物,商品上架 this.allPets.add(pet); //集合中保存对象 } public void delete(Pet pet) { this.allPets.remove(pet); } public ILink<Pet> search(String keyword){ ILink<Pet> searchresult = new LinkImpl<Pet>(); //保存查询结果 Object result[] = this.allPets.toArray(); //获取全部数据 if(result !=null ) { for(Object obj:result) { Pet pet = (Pet)obj; if(pet.getName().contains(keyword)|| pet.getColor().contains(keyword)) { searchresult.add(pet); //保存查询结果 } } } return searchresult; } } class Cat implements Pet{ //实现宠物标准 private String name; private String color; public Cat(String name,String color) { this.name = name; this.color = color; } public String getName() { return this.name; } public String getColor() { return this.color; } public boolean equals(Object obj) { if(obj == null) { return false ; } if (!(obj instanceof Cat)) { return false ; } if (this == obj) { return true ; } Cat cat = (Cat) obj ; return this.name.equals(cat.name) && this.color.equals(cat.color) ; } public String toString() { return "【宠物猫】名字:"+this.name+"、颜色:"+this.color; } } class Dog implements Pet{ private String name; private String color; public Dog(String name,String color) { this.name = name; this.color = color; } public String getName() { return this.name; } public String getColor() { return this.color; } public boolean equals(Object obj) { if(obj == null) { return false ; } if (!(obj instanceof Dog)) { return false ; } if (this == obj) { return true ; } Dog dog = (Dog) obj ; return this.name.equals(dog.name) && this.color.equals(dog.color) ; } public String toString() { return "【宠物狗】名字:"+this.name+"、颜色:"+this.color; } } public class ListCon{ public static void main(String args[]) { Petshop shop = new Petshop(); //开店 shop.add(new Dog("黄斑狗","绿色")); shop.add(new Cat("小强猫","深绿色")); shop.add(new Dog ("黄猫","深色")); shop.add(new Dog ("黄狗","黄色")); shop.add(new Dog ("斑点狗","灰色")); Object result[] = shop.search("黄").toArray(); for(Object obj : result) { System.out.println(obj); } } }


图二 执行结果图

所有的程序开发都是以接口为标准的,这样在进行后期程序处理的时候就可以非常灵活,只要符合标准的对象都可以保存。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:链表实战之超市购物车 | 带你学《Java面向对象编程》之九十六
更多Java面向对象编程文章查看此处

相关文章

java数据结构,双向链表的实现

文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。

java数据结构,双向链表的实现

Android NDK开发实战!Java与C++混合编程,打造极致性能体验!

在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。

Jetty技术深度解析及其在Java中的实战应用

【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。

Java的多线程有什么用

Java的多线程技术广泛应用于提升程序性能和用户体验,具体包括:提高性能,通过并行执行充分利用多核CPU;保持响应性,使用户界面在执行耗时操作时仍流畅交互;资源共享,多个线程共享同一内存空间以协同工作;并发处理,高效管理多个客户端请求;定时任务,利用`ScheduledExecutorService`实现周期性操作;任务分解,将大任务拆分以加速计算。多线程尤其适用于高并发和并行处理场景。

相关知识

12.10综合案例:宠物商店
今天我开始学习:PETSHOP3.0宠物商店(经典案例)
Web3.0宠物商店实战教程:ETH智能合约入门到实践
Java面向对象编程(宠物商店)
宠物商店 案例分析
宠物商店
c语言链表宠物4节点
宠物商店信息管理系统(C++)
***摄影:实战大讲堂之宠物写真(2)
“全民摄影”第11期:实战大讲堂之宠物写真

网址: 链表实战之宠物商店 https://m.mcbbbk.com/newsview361141.html

所属分类:萌宠日常
上一篇: 「宠物链圈、绳带」供应PVC宠物
下一篇: Is Pet品牌介绍