//接口 Box
public interface Box {
boolean add(int element);
int get(int index);
int del(int index);
int getSize();
}
//ArrayBox类 数组结构
public class ArrayBox implements Box{
//设计一个属性,存放真实的数据
private int[]elementDate;
private final int DEFAULT_CAPACITY=10;
//构造方法地重载
public ArrayBox(){
elementDate=new int[DEFAULT_CAPACITY];
}
public ArrayBox(int capacity){
elementDate=new int[capacity--];
}
//有效元素个数
private int size;
private void ensureCapacityInternal(int minCapacity){
//判断,最小容量比原数组长度大,就扩容
if ((minCapacity)-elementDate.length>0){
//计算扩容大小
this.grow(minCapacity);
}
}
private void grow(int minCapacity){
//获取原数组长度
int oldCapacity=elementDate.length;
//在原属组织上扩容1.5倍
int newCapacity=oldCapacity+(oldCapacity>>1);
//比较计算后的长度与所需的长度
if (newCapacity-minCapacity<0){
newCapacity=minCapacity-1;
}
//把就数组中的元素复制到新数组中
elementDate= this.copyOf(elementDate,newCapacity);
}
private int[]copyOf(int[] oldArray,int newCapacity){//newCapacity新数组的长度
//按提供的长度创建一个新数组
int []newArray=new int[newCapacity];
for (int i=0;i<oldArray.length;i++){
newArray[i]= oldArray[i];
}
return newArray;
}
public boolean add(int element){
//1.确保数组容量够用
this.ensureCapacityInternal(size+1);
//上面代码执行完 证明elementDate地数组肯定够用
//直接将新来的element元素存入数组中 ,让size多记录一个
elementDate[size++]=element;
return true;
}
private void rangeCheck(int index){
if (index<0||index>size){
//自定义异常
throw new BoxIndexOutOfBoundsException("index:"+index+" size:"+size);
}
}
//获取指定位置的元素
public int get(int index){
//检测给定的index是否合法
this.rangeCheck(index);
//返回
return elementDate[index];
}
//删除指定位置的元素 参数是索引位置
public int del(int index){
this.rangeCheck(index);
//找到index位置地元素保存起来
int oldValue=elementDate[index];
for (int i=index;i<size-1;i++){
elementDate[i]=elementDate[i+1];
}
//将最后一个元素删除 让size少记录一个
elementDate[--size]=0;
//返回数组
return oldValue;
}
public int getSize() {
return size;
}
//LinkedBox类
/*
* 双向链表结构
*
* */
public class LinkedBox implements Box {
private Node first;
private Node last;
private int size;//有效元素的个数
//数据结构 链式结构 链表
//设计一个小A同学 将元素添加在新node里 挂在链表的尾端
private void linkLast(int element){
//获取链表de尾节点
Node l=last;
//创建一个新的nde对象,将新数据包装起来
Node newNode=new Node(l,element,null);
//将新节点对象设置为尾节点
last=newNode;
//判断 如果原来尾节点没有对象 这个链表没有使用过
if (l==null){
first=newNode;
}
else {
//原来用过
l.next=newNode;
}
size++;
}
public boolean add(int element) {
//将element存入一个新的Node对象中 添加至链表的尾端
this.linkLast(element);
//烤制添加成功
return true;
}
//-------------------------------------------------------------------
//设计一个方法,负责检测index
private void rangeCheck(int index){
if (index<0||index>=size){
throw new BoxIndexOutOfBoundsException("Index:"+index+"Size:"+size);
}
}
//寻找node
private Node findNode(int index){
Node targetNode;
//判断index范围是在前半部分还是后半部分
if (index<(size>>1)){//从前往后找
targetNode=first;
for (int i=0;i<index;i++){
targetNode=targetNode.next;
}
}else {
targetNode=last;
for (int i = size-1; i>index ; i--) {
targetNode=targetNode.previous;
}
}
return targetNode;
}
public int get(int index) {
//检测index是否合法
this.rangeCheck(index);
//找寻index对应位置的node对象 将对象中的数据提取出来
Node targrtNode= this.findNode(index);
//返回找到的node对象的数据
return targrtNode.item;
}
//设计一个方法,把给定的节点对象删除 保留数据
private int unlink(Node targetNode){
//获
int oldValue=targetNode.item;
Node prev=targetNode.previous;
Node next=targetNode.next;
//删除节点对象
if (prev==null){//证明前一个人没有,当前是第一个
first=next;
}
else {
prev.next=next;
targetNode.previous=null;
}
if (next==null){//证明当前node是最后一个
last=prev;
}
else {
next.previous=prev;
targetNode.next=null;
}
//有效元素减少一个
size--;
return oldValue;
}
public int del(int index) {//删除节点
this.rangeCheck(index);
//找到index位置的那个node
Node targetNode=this.findNode(index);
//设计一个方法 删除当前目标节点
int oldValue= this.unlink(targetNode);
return oldValue;
}
public int getSize() {//获取长度
return size;
}
}
//节点 Node
public class Node {
public Node previous;//上一个
public int item;//当前数据
public Node next;//下一个node对象
public Node(Node previous, int item, Node next) {
this.previous = previous;
this.item = item;
this.next = next;
}
}
//自定义异常
public class BoxIndexOutOfBoundsException extends RuntimeException {
public BoxIndexOutOfBoundsException(){}
public BoxIndexOutOfBoundsException(String src){
super(src);
}
}
//最后呢写个类测试一下
public class TestMain {
public static void main(String[] args) {
ArrayBox ab=new ArrayBox();
for (int i=0;i<=14;i++){
ab.add(i);
}
System.out.println("有效元素个数:"+ab.getSize());
for (int i=0;i<=14;i++){
int val= ab.get(i);
System.out.print(val+" ");
}
ab.del(5);
System.out.println();
for (int i=0;i<=13;i++){
int value= ab.get(i);
System.out.print(value+" ");
}
System.out.println("有效元素个数:"+ab.getSize());
System.out.println("-------------------------------------");
LinkedBox linkedBox=new LinkedBox();
for (int i=0;i<=14;i++){
linkedBox.add(i);
}
for (int i=0;i<=14;i++){
int val= linkedBox.get(i);
System.out.print(val+" ");
}
System.out.println("有效元素de个数:"+linkedBox.getSize());
linkedBox.del(5);
System.out.println();
for (int i=0;i<=13;i++){
int value= linkedBox.get(i);
System.out.print(value+" ");
}
System.out.println("有效de元素数:"+linkedBox.getSize());
}
}