zoukankan      html  css  js  c++  java
  • java存储元素,两种设计方式,一种是数组;一种是链表(联络网)

    方式一、数组;数组默认长度;存放数据的数组;有效元素个数;add、remove、get、size;

    add;需要考虑数据长度>=size+1? 不大的话,需要扩容;扩容后,需要将原数组数据移到新数组;size++

    remove;索引是否合理?不合理的话,抛出异常,中断程序;合理的话,从索引+1处左移元素;原数组最后一位有效元素置为空;(int类型默认为0);size--

    get;索引是否合理?不合理的话,抛出异常中断程序;合理的话,直接返回索引对应的值;

    size;

    package box;
    public class ArrayBox{
    	//设计一个静态常量
    	private static final int DEFAULT_CAPACITY=10;
    	private int[] elementData;//存放真实数据的[]
    	private int size;//有效元素个数
    	public ArrayBox(){
    		elementData=new int[DEFAULT_CAPACITY];
    	}
    	public ArrayBox(int num){
    		elementData=new int[num];
    	}//构造方法重载;
    	//确保数组内部的容量
    	private void ensureCapacity(int minCapacity){
    		//判断小,则扩容;
    		if(minCapacity>elementData.length){
    			this.grow(minCapacity);
    		}
    		
    	}
    	//扩容大小
    	private void grow(int minCapacity){
    		if(minCapacity<(elementData.length>>1)*3){
    			minCapacity=(elementData.length>>1)*3;
    		}
    		elementData=this.copyArray(elementData,minCapacity);
    		
    	}
    	//原数组中元素移入新数组
    	private int[] copyArray(int[] oldArray,int minCapacity){
    		int[] newArray=new int[minCapacity];
    		for(int i=0;i<oldArray.length;i++){
    			newArray[i]=oldArray[i];
    		}
    		return newArray;
    		
    	}
    	//检测index是否合法
    	private void rangeCheck(int indexx){
    		if(indexx<0 || indexx>=size){
    			//自定义异常
    			throw new BoxIndexOutOfBoundsException("index:"+indexx+",size:"+size);
    		}
    	}
    	
    	
    	//-----------------------------------------
    	public boolean add(int element){
    		this.ensureCapacity(size+1);
    		elementData[size++]=element;
    		return true;	
    	}
    	
    	public int remove(int indexx){
    		this.rangeCheck(indexx);
    		int oldValue=elementData[indexx];
    		for(int i=indexx;i<size-1;i++){//indexx开始左移;
    			elementData[i]=elementData[i+1];			
    		}
    		elementData[size-1]=0;//手动将最后的元素删除;
    		size--;
    		return oldValue;
    		
    	}
    	public int get(int indexx){
    		this.rangeCheck(indexx);//检测index是否合法		
    		return elementData[indexx];
    	}
    	public int size(){
    		return size;
    	}
    }
    

     

    package box;
    public class BoxIndexOutOfBoundsException extends RuntimeException{
    	public BoxIndexOutOfBoundsException(){
    	}
    	public BoxIndexOutOfBoundsException(String msg){
    		super(msg);
    	}
    }
    
    package box;
    public class Test{
    	public static void main(String[] args){
    		LinkBox x=new LinkBox();
    		boolean add=x.add(10);
    		x.add(20);
    		x.add(3);
    		x.add(2);
    		x.add(1);
    		x.add(4);
    		x.add(5);
    		x.add(6);
    		x.add(7);
    		x.add(8);
    		x.add(9);
    		x.add(22);
    		x.add(30);
    		int get=x.get(8);
    		int remove=x.remove(9);
    		int size=x.size();
    		
    		System.out.println("添加结果:"+add+";获取结果"+get+"删除结果:"+remove+";长度"+size);
    		
    		
    		ArrayBox j=new ArrayBox();
    		j.add(10);
    		boolean addd=j.add(20);
    		j.add(3);
    		j.add(2);
    		j.add(1);
    		j.add(4);
    		j.add(5);
    		j.add(6);
    		j.add(7);
    		j.add(8);
    		j.add(9);
    		j.add(22);
    		j.add(30);
    		int gett=j.get(8);
    		int removee=j.remove(9);
    		int sizee=j.size();
    		System.out.println("添加结果:"+addd+";获取结果"+gett+"删除结果:"+removee+";长度"+sizee);
    	}
    }
    

     方式二、链表;首节点(是某一个节点)first、尾节点last、有效元素个数size;

     一个节点(Node)包含:前一个Node对象,元素值(element),后一个Node对象;

    add;将add的element组合成一个新的节点;并将这个新节点作为尾节点;若是之前尾节点为空,则当前新节点(是第一个节点)即是首节点也是尾节点;若之前尾结点不为空,则之前尾节点中的后一个Node对象=新节点;size++;

    remove;判断索引是否合理?不合理,抛出异常,中断程序;合理,找到该节点?如何找节点;根据索引,first是索引0对应的Node对象;索引1对应的Node对象是Node nodee=first.after;索引2对应的Node对象是nodee.after;

        若是size过大,索引值也挺大,从头开始找,找的次数过多;所以,判断索引<size/2? 小于,则从first开始找;否则从last开始找;last是索引size-1对应的Node对象;索引size-2对应的Node对象是Node nodee=last.prev;索引size-3对应的Node对象是nodee.prev;

    get;判断所以是否合理?不合理,抛出异常,中断程序;合理,找到该节点,并取出该节点的值;

    size;

    package box;
    public class Node{
    	public Node prev;//前;
    	public Node after;//后;
    	public int element;
    	public Node(Node prev,int element,Node after){
    		this.prev=prev;
    		this.element=element;
    		this.after=after;
    	}//构造方法;
    }
    

     

    package box;
    public class LinkBox{
    	public Node first;//记录首节点;
    	public Node last;//尾节点;
    	public int size;//记录有效元素个数
    	//添加element;
    	public void addLink(int element){
    		Node l=last;//获取尾节点;
    		Node newNode=new Node(l,element,null);
    		last=newNode;
    		if(l==null){//之前无人使用过
    			first=newNode;
    		}else{//之前有人使用过,之前last的after
    			l.after=newNode;			
    		}
    		
    		size++;
    	}
    	//查看indexx是否合理;
    	public void rangeCheck(int indexx){
    		if(indexx<0 || indexx>size-1){
    			throw new BoxIndexOutOfBoundsException("index:"+indexx+",size:"+size);
    		}
    	}
    	//查看indexx对应的node
    	public Node nodeValue(int indexx){
    		Node nodee;
    		if(indexx < (size>>1)){
    			nodee=first;
    			for(int i=0;i<indexx;i++){
    				nodee=nodee.after;
    			}
    		}else{
    			nodee=last;
    			for(int i=size-1;i>indexx;i--){
    				nodee=nodee.prev;
    			}
    		}
    		return nodee;
    		
    	}
    	//删除indexx对应的node
    	public int unLink(int indexx){
    		Node nodee=this.nodeValue(indexx);
    		Node bf=nodee.prev;//当前nodee的前一个;
    		Node af=nodee.after;
    		if(bf==null){//第一个;
    			first=af;
    		}else{
    			bf.after=af;
    			nodee.prev=null;
    		}
    		if(af==null){//当前Node为最后一个;
    			last=bf;
    		}else{
    			af.prev=bf;
    			nodee.after=null;
    		}		
    		size--;
    		return nodee.element;
    	}
    //-----------------------------------------------------------------------------
    	public boolean add(int element){
    		this.addLink(element);
    		return true;
    	
    	}
    	public int remove(int indexx){
    		this.rangeCheck(indexx);
    		int a=this.unLink(indexx);
    		return a;
    		
    	}
    	public int get(int indexx){
    		this.rangeCheck(indexx);//检测index是否合法
    		Node a=nodeValue(indexx);
    		int b=a.element;
    		return b;
    	}
    	public int size(){
    		return size;
    	}
    }
    

     

     

     

      

     

    联络网:单向链表( A-->B-->C-->D);双向链表;环链表;

    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    自动代码质量分析示例搭建
    Springboot监听多个端口
    restFul风格调用get、post请求(包含文件上传与下载)
    主机和虚拟机的网络互通设置
    centos7 linux 安装mysql
    【Flutter】ShaderMash 着色器实现渐变色文字
    Git强制还原本地文件到特定的版本
    VS一直显示“正在从以下位置***加载符号”的解决办法
    .net类库
    hyperf json-rpc剖析
  • 原文地址:https://www.cnblogs.com/canglongdao/p/12872892.html
Copyright © 2011-2022 走看看