上一篇:改数需备案-记录链表数据量 | 带你学《Java面向对象编程》之九十一
【本节目标】
通过阅读本节内容,你将学会实现isEmpty()和toArray()方法,为链表对象提供直接判断是否为空以及获取链表数据的方法,进一步完善链表类的相关功能。
空集合判断:public Boolean isEmpty()
链表里面可以保存有若干数据,如果说现在链表还没有保存数据,则就表示是一个空集合,则应该提供有一个空的判断。
1、在ILink接口里面追加有判断方法:
public boolean isEmpty() ; //判断是否空集合
2、在LinkImpl子类里面覆写此方法。
public boolean isEmpty() {
//return this.root == null ;
return this.count == 0 ;
}
使用根节点或者长度判断其本质是一样的。
interface ILink<E> { //设置泛型避免安全隐患
public void add(E e) ; //增加数据
public int size() ; //获取数据的个数
public boolean isEmpty() ; //判断是否空集合
}
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);
}
}
}
//------------以下为Link类中定义的成员-----------------
private Node root ; //保存根元素
private int count ; //保存数据的个数
//------------以下为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 class LinkDemo{
public static void main(String args[]) {
ILink<String> all = new LinkImpl<String>() ;
System.out.println("【增加之前】数据个数:" + all.size() + "、是否为空集合:" + all.isEmpty()) ;
all.add("Hello") ;
all.add("World") ;
all.add("MLDN") ;
System.out.println("【增加之后】数据个数:" + all.size() + "、是否为空集合:" + all.isEmpty()) ;
}
}
图一 执行结果图
返回集合数据:public Object[] toArray()
链表本身就属于一个动态对象数组,那么既然是一个对象数组,就应该可以把所有的数据以数组的形式返回来,那么这个时候就可以定义一个toArray()方法,但是这个时候的方法只能够返回Object型的数组。
图二 数据返回
1、在ILink接口里面追加新的处理方法:
public Object[] toArray() ; //将集合元素以数组的形式返回
2、在LinkImpl子类里面追加有两个属性:
private int foot ; //描述的是操作数组的脚标
private Object [] returnData ; //返回的数据保存
3、在Node类中根据递归获取数据
//第一次调用: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() ;
}
}
4、在进行数据返回的时候一定要首先判断数据返回是否为空
public Object[] toArray() {
if (this.isEmpty()) { //空集合
return null ; //现在没有数据
}
this.foot = 0 ; //脚标清零
this.returnData = new Object[this.count] ; //根据已有的长度开辟数组
this.root.toArrayNode() ; //利用Node类进行递归数据获取
return this.returnData ;
}
图三 执行结果图
集合的数据一般如果要返回肯定要以对象数组的形式返回。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学