zoukankan      html  css  js  c++  java
  • 数据结构基础 ---- 数组的理解和实现(Java)

    什么是数组

    数组是由类型相同的数据元素构成的有序集合,每个元素称为数组元素,每个元素受n(n>= 1)个线性关系的约束,每个元素在n个线性关系中的序号i1, i2, ....., in称该元素的下标,可以通过下标访问该数据元素。数组可以看成是线性表的推广,其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型。(注:出自数据结构严蔚敏c语言版第二版第四章)

    数组的存储方式

    在一般情况下数组不做插入和删除操作,也就是说建立了数组,那么结构中的元素个数和元素之间的关系也就不再发生变动。所以采用顺序存储结构表示数组比较合适。当然,数组也可以采用链式结构来进行实现。

    我们知道,从存储的角度来看,存储单元是一维的结构,而数组可能是多维的结构,那么用一组连续存储单元存放数组的数据元素也就有了次序约定问题。

    int a[5];

    当定义一个数组的时候a时,编译器根据指定的元素个数和元素类型来进行分配确定大小的存储空间。

    对于二维数组,它在逻辑上是由行和列组成的。因此,我们可以将上面的二维数组 a 分为三层来理解。 

     但是这里有一个问题,那就是数组的存储空间在定义时已经确定,对于没有用到的存储空间,系统并不会收回,这就造成了空间浪费

    动态数组

    我们可以简单的手动实现一个动态数组,当数组中元素的数量是数组的容量时,使数组的容量扩容为之前的2倍。而当数组中元素个数是数组容量的四分之一时,让数组的容量缩容至二分之一。

    代码实现:

    package 数组和矩阵;
    
    
    /**
     * Java基于顺序表实现动态数组
     * @author shanlei
     *
     * @param <E>
     */
    public class DynamicArray<E> {
    
    	private E[] data; //存放元素
    	private int size; //数组中元素的个数
    	private static int startLength = 100; //数组默认的初始长度
    	
    	public DynamicArray() {
    		this(startLength);
    		
    	}
    	
    	public DynamicArray(int length) {
    		this.startLength = length;
    		data = (E[]) new Object[startLength];
    	}
    	
    	//判断数组是否为空
    	public boolean isEmpty() {
    		return size == 0 ? true : false;
    	}
    	
    	//判断数组已满
    	public boolean isFull() {
    		return size == startLength ? true : false;
    	}
    	
    	//获得数组中元素的个数
    	public int getSize() {
    		return size;
    	}
    	
    	//向数组中添加元素
    	public void add(E e) {
    		if(size == data.length) {
    			changeSize(size * 2);
    		}
    		data[size] = e;
    		size++;
    	}
    	
    	//设置指定位置元素的值
    	public E setElement(int index, E e) {
    		if(index < 0 || index > size - 1) 
    			throw new IllegalArgumentException("set failed, index is illegal");
    		E old = data[index];
    		data[index] = e;
    		return old;
    	}
    	
    	//获得指定位置的元素
    	public E getElement(int index) {
    		if(index < 0 || index > size - 1) 
    			throw new IllegalArgumentException("set failed, index is illegal");
    		return data[index];
    	}
    	
    	//查找元素在数组中的位置
    	public int find(E e) {
    		int i = 0;
    		while(i < size) {
    			if(e.equals(data[i])) return i;
    			else i++;
    		}
    		return -1;
    	}
    	
    	//移除数组中指定的元素
    	public E remove(int index) {
    		if(index < 0 || index > size - 1) 
    			throw new IllegalArgumentException("set failed, index is illegal");
    		E e = data[index];
    		for (int i = index; i < size - 1; i++) {
    			data[i] = data[i + 1];
    		}
    		size--;
    		if(size == data.length / 4 && data.length / 2 != 0) {
    			changeSize(data.length / 2);
    		}
    		return e;
    	}
    	
    	//向数组指定位置中插入元素
    	public void insertElement(int index, E e) {
    		if(size == data.length) {
    			changeSize(size * 2);
    		}
    		
    		size++;
    		for (int i = size - 1; i >= index; i--) {
    			data[i + 1] = data[i];
    		}
    		data[index] = e;
    	}
    	
    	
    	//移除数组中指定元素值的元素
    	public int removeElement(E e) {
    		int index = find(e);
    		if(index != -1) {
    			remove(index);
    		}
    		return index;
    	}
    	
    	//扩容/增容方法
    	private void changeSize(int newSize) {
    		E[] newArr = (E[]) new Object[newSize];
    		for (int i = 0; i < size; i++) {
    			newArr[i] = data[i];
    		}
    		data = newArr;
    		newArr = null;
    	}
    	
    	
    	public static void main(String[] args) {
    		DynamicArray arr = new DynamicArray();
    		for (int i = 0; i < 7; i++) {
    			arr.add(i);
    		}
    		System.out.println("数组中元素个数为:" + arr.getSize());
    		
    		arr.setElement(3, 55);
    		arr.setElement(4, 89);
    		System.out.println("第四个元素值为: " + arr.getElement(3));
    		System.out.println("数组中值为55的下标为:" + arr.find(55));
    		
    		arr.remove(4);
    		System.out.println("数组中元素个数为:" + arr.getSize());
    		System.out.println("第五个元素值为: " + arr.getElement(4));
    		arr.insertElement(4, 46);
    		System.out.println("数组中元素个数为:" + arr.getSize());
    		System.out.println("第五个元素值为: " + arr.getElement(4));
    		
    		arr.removeElement(46);
    		System.out.println("第五个元素值为: " + arr.getElement(4));
    		
    	}
    
    }
    
  • 相关阅读:
    一个由"2020年1月7日 京东出现的重大 Bug 漏洞"引起的思考...
    Jmeter查看结果树之查看响应的13种方法[详解] [9]
    Jmeter 查看结果树之界面功能介绍 [8]
    soapUI 之 测试文件上传 [6]
    SoapUI 之 webService 接口测试 [5]
    SoapUI 关联之Property Transfer、JSONPath、Xpath [4]
    SoapUI 参数化之Properties、DataSource [3]
    找不到工作?!请确认你投简历的姿势对了么?
    Jmeter 从数据库查询多个字段,依次传给登录接口怎么实现?[7]
    Jmeter 之测试片段、Include Controller、模块控制器应用 [6]
  • 原文地址:https://www.cnblogs.com/lishanlei/p/10707848.html
Copyright © 2011-2022 走看看