Java数据结构系列-数组

数组是应用最广泛的数据存储结构。它被植入到大部分编程语言中。由于数组十分易懂,所以它被用来作为介绍数据结构的起步点,并展示面向对象编程和数据结构之间的相互关系。

使用数组

创建数组

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

 int[] intArray;
 intArray = new int[100];

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

int intArray[] = new int[100];

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

获取数组大小

数组有一个length字段,通过它可以得知当前数组大小(数据项的个数):

int arrayLength = intArray.length;

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

访问数组数据项

数组数据项通过使用方括号中的下标数来访问。这与其他语言类似:

temp = intArray[3];
intArray[7] = 66;

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

初始化

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

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();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,224评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,062评论 6 13
  • 拆掉心里的安全感 安全感这个话题,是我现在最大的问题。一个是自己性格和经历上造成的想太多,甚至很多时候会负面思维过...
    宋清尘啊阅读 1,598评论 0 1
  • 阳光在 你知道的 清晨在 你知道的 岁月在 你知道的 你不知道的 一只雄鸟 一直陪着 一只雌鸟 在那片林子里 锻炼身体
    宝宝王A阅读 1,252评论 0 1
  • 人面不知何处去,桃花依旧笑春风。 来一场寻找文化之旅, 我们一起相约在路上, 相约在小城谷事。 文化定制, 走一次...
    遠行無舟渡阅读 891评论 0 0

友情链接更多精彩内容