Java数据结构-数组

数组是应用最普遍的数据存储结构。它被植入到大部分编程语言中。因为数组十分易懂,因此它被用来做为介绍数据结构的起步点,并展现面向对象编程和数据结构之间的相互关系。java

使用数组

建立数组

Java中两种数据类型:基本类型和对象类型。在许多编程语言中(如C++),数组也是基本类型,但在Java中把它们看成对象来对待,所以在建立数组时必须使用new操做符:编程

int[] intArray;
 intArray = new int[100];
复制代码

[] 操做符对编译器来讲是一个标志,它说明正在命名的是数组对象而不是普通的变量。还能够经过另外一种语法来使用这个操做符,将它放在变量名的后面,而不是类型后面:数组

int intArray[] = new int[100];
复制代码

可是将[] 放在int后面会清楚地说明[]是数据类型的一部分,而不是变量名的一部分。微信

获取数组大小

数组有一个length字段,经过它能够得知当前数组大小(数据项的个数):数据结构

int arrayLength = intArray.length;
复制代码

正如大多数编程语言同样,一旦建立数组,数组大小便不可改变编程语言

访问数组数据项

数组数据项经过使用方括号中的下标数来访问。这与其余语言相似:spa

temp = intArray[3];
intArray[7] = 66;
复制代码

若是访问小于0或比数组大小大的数据项,程序会出现Array Index Out of Bounds(数组下标越界)的运行时差错误。数组的下标是从0开始的,也就是说第一个数据项的下标是0。code

初始化

当建立数组以后,若是不另行指定,基本类型数组会自动赋值为0或0.0而对象数组会自动赋值为null对象。使用下面的语法能够对一个基本类型的数组初始化,赋入非空值:cdn

int[] intArray = {0,3,6,9,12,15};
复制代码

数组使用的例子

/** * HighArray对数组基本操做进行封装 */
public class HighArray {

    private long [] a;

    private int nElems;

    public HighArray(int max){
        a = new long[max];
        nElems = 0;
    }

    /** * 查找 */
    public boolean find(long searchKey){
        int j;
        for(j = 0; j < nElems;j++){
            if(a[j] == searchKey){
                break;
            }
        }
        if(j == nElems){
            return false;
        }
        else{
            return true;
        }
    }

    /** * 插入 * @param value */
    public void insert(long value){
        a[nElems] = value;
        nElems++;
    }

    /** * 删除 * @param value * @return */
    public boolean delete(long value){
       int j;
       for(j = 0; j < nElems;j++){
           if(value == a[j]){
               break;
           }
       }
       if(j == nElems){
           return false;
       }else{
           // 移动后面的元素
           for (int k = j; k < nElems;k++){
               a[k] = a[k+1];
           }
           nElems--;
           return true;
       }
    }

    /** * 遍历数组元素 */
    public void display(){
        for(int j = 0; j < nElems; j++){
            System.out.print(a[j]+" ");
        }
        System.out.println();
    }
}
复制代码

有序数组

假设一个数组,其中的数据项按关键字升序排列,即最小值在下标为0的单元上,每个单元比前一个单元的值大。这种数组被称为有序数组。将数据按顺序排序的好处就是能够经过二分查找显著地提升查找速度对象

当向这种数组中插入数据项时,须要为插入操做找到正确的位置:恰好在稍小值的后面,稍大值的前面。而后将全部比待插入的数据项大的值向后移以便腾出空间。

二分查找

二分查找使用的方法与咱们在孩童时期常玩的猜数游戏中所用的方法同样。在这个游戏里,一个朋友会让你猜她正想的一个1至100之间的数。当你猜来一个数后,它会告诉你三种选择中的一个:你猜的比她想的大,或小,或猜中了。

为了能用最少的次数猜中,必须从50开始猜。若是她说你猜得过小,则推出那个数在51至100之间,因此下一次猜75。但若是她说有些大,则推出那个数在1至49之间,因此下一次猜25。

每猜一次就会将可能的值划分红两部分。最后范围会缩小到一个数字那么大,那就是答案。

有序数组的Java代码

public class OrdArray {

    private long[] a;
    private int nElems;

    public OrdArray(int max){
        a = new long[max];
        nElems = 0;
    }

    public int size(){
        return nElems;
    }

    // 二分查找
    public int find(long searchKey){
        int lowerBound = 0;
        int upperBound = nElems - 1;
        int curIn;
        
        while (true){
            curIn = (lowerBound + upperBound) / 2;
            if(a[curIn] == searchKey){
                return curIn;
            }else if (lowerBound > upperBound){
                return nElems;   // can't find it
            }else {
                if(a[curIn] < searchKey){
                    lowerBound = curIn + 1;
                }else {
                    upperBound = curIn - 1;
                }
            }

        }
    }

    public void insert(long value){
        int j;
         // 找到待插入的位置
        for(j = 0; j < nElems;j++){
            if(a[j] > value){
                break;
            }
        }
        // 腾出空间
        for(int k = nElems;k > j;k--){ 
            a[k] = a[k-1];
        }
        a[j] = value;
        nElems++;
    }

    public boolean delete(long value){
        int j = find(value);
        if(j == nElems){
            return false;
        }else{
            for (int k = j;k < nElems;k++){
                a[k] = a[k+1];
            }
            nElems--;
            return true;
        }
    }

    public void display(){
        for(int j = 0; j < nElems; j++){
            System.out.print(a[j]+" ");
        }
        System.out.println();
    }
}
复制代码

欢迎留言补充,共同交流。我的微信公众号求关注

相关文章
相关标签/搜索