Java數(shù)據(jù)結(jié)構(gòu)系列-數(shù)組

數(shù)組是應(yīng)用最廣泛的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)拜英。它被植入到大部分編程語(yǔ)言中。由于數(shù)組十分易懂,所以它被用來(lái)作為介紹數(shù)據(jù)結(jié)構(gòu)的起步點(diǎn),并展示面向?qū)ο缶幊毯蛿?shù)據(jù)結(jié)構(gòu)之間的相互關(guān)系揍瑟。

使用數(shù)組

創(chuàng)建數(shù)組

Java中兩種數(shù)據(jù)類型:基本類型和對(duì)象類型蟆盹。在許多編程語(yǔ)言中(如C++)阐滩,數(shù)組也是基本類型坪稽,但在Java中把它們當(dāng)作對(duì)象來(lái)對(duì)待,因此在創(chuàng)建數(shù)組時(shí)必須使用new操作符:

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

[] 操作符對(duì)編譯器來(lái)說(shuō)是一個(gè)標(biāo)志扛伍,它說(shuō)明正在命名的是數(shù)組對(duì)象而不是普通的變量筷畦。還可以通過(guò)另一種語(yǔ)法來(lái)使用這個(gè)操作符,將它放在變量名的后面刺洒,而不是類型后面:

int intArray[] = new int[100];

但是將[] 放在int后面會(huì)清楚地說(shuō)明[]是數(shù)據(jù)類型的一部分鳖宾,而不是變量名的一部分。

獲取數(shù)組大小

數(shù)組有一個(gè)length字段逆航,通過(guò)它可以得知當(dāng)前數(shù)組大腥撂病(數(shù)據(jù)項(xiàng)的個(gè)數(shù)):

int arrayLength = intArray.length;

正如大多數(shù)編程語(yǔ)言一樣,一旦創(chuàng)建數(shù)組纸泡,數(shù)組大小便不可改變漂问。

訪問(wèn)數(shù)組數(shù)據(jù)項(xiàng)

數(shù)組數(shù)據(jù)項(xiàng)通過(guò)使用方括號(hào)中的下標(biāo)數(shù)來(lái)訪問(wèn)。這與其他語(yǔ)言類似:

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

如果訪問(wèn)小于0或比數(shù)組大小大的數(shù)據(jù)項(xiàng)女揭,程序會(huì)出現(xiàn)Array Index Out of Bounds(數(shù)組下標(biāo)越界)的運(yùn)行時(shí)差錯(cuò)誤蚤假。數(shù)組的下標(biāo)是從0開(kāi)始的,也就是說(shuō)第一個(gè)數(shù)據(jù)項(xiàng)的下標(biāo)是0吧兔。

初始化

當(dāng)創(chuàng)建數(shù)組之后磷仰,如果不另行指定,基本類型數(shù)組會(huì)自動(dòng)賦值為0或0.0而對(duì)象數(shù)組會(huì)自動(dòng)賦值為null對(duì)象境蔼。使用下面的語(yǔ)法可以對(duì)一個(gè)基本類型的數(shù)組初始化灶平,賦入非空值:

int[] intArray = {0,3,6,9,12,15};

數(shù)組使用的例子

/**
 * HighArray對(duì)數(shù)組基本操作進(jìn)行封裝
 */
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{
           // 移動(dòng)后面的元素
           for (int k = j; k < nElems;k++){
               a[k] = a[k+1];
           }
           nElems--;
           return true;
       }
    }

    /**
     * 遍歷數(shù)組元素
     */
    public void display(){
        for(int j = 0; j < nElems; j++){
            System.out.print(a[j]+" ");
        }
        System.out.println();
    }
}

有序數(shù)組

假設(shè)一個(gè)數(shù)組伺通,其中的數(shù)據(jù)項(xiàng)按關(guān)鍵字升序排列,即最小值在下標(biāo)為0的單元上逢享,每一個(gè)單元比前一個(gè)單元的值大罐监。這種數(shù)組被稱為有序數(shù)組。將數(shù)據(jù)按順序排序的好處就是可以通過(guò)二分查找顯著地提高查找速度瞒爬。

當(dāng)向這種數(shù)組中插入數(shù)據(jù)項(xiàng)時(shí)弓柱,需要為插入操作找到正確的位置:剛好在稍小值的后面,稍大值的前面侧但。然后將所有比待插入的數(shù)據(jù)項(xiàng)大的值向后移以便騰出空間矢空。

二分查找

二分查找使用的方法與我們?cè)诤⑼瘯r(shí)期常玩的猜數(shù)游戲中所用的方法一樣。在這個(gè)游戲里禀横,一個(gè)朋友會(huì)讓你猜她正想的一個(gè)1至100之間的數(shù)屁药。當(dāng)你猜來(lái)一個(gè)數(shù)后,它會(huì)告訴你三種選擇中的一個(gè):你猜的比她想的大柏锄,或小酿箭,或猜中了。

為了能用最少的次數(shù)猜中绢彤,必須從50開(kāi)始猜。如果她說(shuō)你猜得太小蜓耻,則推出那個(gè)數(shù)在51至100之間茫舶,所以下一次猜75。但如果她說(shuō)有些大刹淌,則推出那個(gè)數(shù)在1至49之間饶氏,所以下一次猜25。

每猜一次就會(huì)將可能的值劃分成兩部分有勾。最后范圍會(huì)縮小到一個(gè)數(shù)字那么大疹启,那就是答案。

有序數(shù)組的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();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔼卡,一起剝皮案震驚了整個(gè)濱河市喊崖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雇逞,老刑警劉巖荤懂,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異塘砸,居然都是意外死亡节仿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門掉蔬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)廊宪,“玉大人矾瘾,你說(shuō)我怎么就攤上這事〖簦” “怎么了壕翩?”我有些...
    開(kāi)封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)册烈。 經(jīng)常有香客問(wèn)我戈泼,道長(zhǎng),這世上最難降的妖魔是什么赏僧? 我笑而不...
    開(kāi)封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任大猛,我火速辦了婚禮,結(jié)果婚禮上淀零,老公的妹妹穿的比我還像新娘挽绩。我一直安慰自己,他們只是感情好驾中,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布唉堪。 她就那樣靜靜地躺著,像睡著了一般肩民。 火紅的嫁衣襯著肌膚如雪唠亚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天持痰,我揣著相機(jī)與錄音灶搜,去河邊找鬼。 笑死工窍,一個(gè)胖子當(dāng)著我的面吹牛割卖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播患雏,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鹏溯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了淹仑?” 一聲冷哼從身側(cè)響起丙挽,我...
    開(kāi)封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匀借,沒(méi)想到半個(gè)月后取试,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怀吻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年瞬浓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓬坡。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猿棉,死狀恐怖磅叛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萨赁,我是刑警寧澤弊琴,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站杖爽,受9級(jí)特大地震影響敲董,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慰安,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一腋寨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧化焕,春花似錦萄窜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至凤类,卻和暖如春穗泵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谜疤。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工佃延, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茎截。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓苇侵,卻偏偏與公主長(zhǎng)得像赶盔,于是被迫代替她去往敵國(guó)和親企锌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理于未,服務(wù)發(fā)現(xiàn)撕攒,斷路器,智...
    卡卡羅2017閱讀 134,693評(píng)論 18 139
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 11,003評(píng)論 6 13
  • 拆掉心里的安全感 安全感這個(gè)話題烘浦,是我現(xiàn)在最大的問(wèn)題抖坪。一個(gè)是自己性格和經(jīng)歷上造成的想太多,甚至很多時(shí)候會(huì)負(fù)面思維過(guò)...
    宋清塵啊閱讀 210評(píng)論 0 1
  • 陽(yáng)光在 你知道的 清晨在 你知道的 歲月在 你知道的 你不知道的 一只雄鳥(niǎo) 一直陪著 一只雌鳥(niǎo) 在那片林子里 鍛煉身體
    寶寶王A閱讀 142評(píng)論 0 1
  • 人面不知何處去,桃花依舊笑春風(fēng)握侧。 來(lái)一場(chǎng)尋找文化之旅蚯瞧, 我們一起相約在路上嘿期, 相約在小城谷事。 文化定制埋合, 走一次...
    遠(yuǎn)行無(wú)舟渡閱讀 72評(píng)論 0 0