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();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

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