------- android教育訓練、java教育訓練、期待與您交流!--------
數組的基本概念
數組是一種存放資料的 容器 數組的資料資料類型都相同 數組具有一個固定的長度 l 數組中的資料都有一個唯一的編号叫做數組元素 索引 或數組元素 下标 數組的索引從 0 開始 通路數組中的元素使用 索引 來通路 建立數組的記憶體空間使用 new 關鍵字實作、
數組是一種簡單的複合資料類型。它是存放具有相同資料類型的數值的資料結構,它的每一個元素都具有同一個類型,先後順序也是固定的,數組一旦建立之後,大小就固定了,不再發生變化,它的資料類型既可以是簡單類型,也可以是類,數組通常分為一維數組,二維數組和多元,但是使用比較多的還是一維數組和二維數組。
一維數組
一維數組可以存放成千上萬個資料,它們是一組相關的存儲單元,這些存儲單元在邏輯上被看作是互相獨立的若元素,它們具有相同的名字和資料類型,數組中的某個特定的元素有它的下标決定,隻有一個下标的數組稱為一維數組。聲明一個一維數組的形式如下:
資料類型 數組名[ ]或者資料類型 [ ] 數組名
格式 1 : • 資料類型 [ ] 數組名 ; • int [ ] arr ; double[ ] arr1; • boolean arr2 [ ] long [ ] arr3 格式 2 : • 資料類型 [ ] 數組名 = new 資料類型 [ 數組長度 ]; • int [ ] arr = new int [4]; • double [ ] arr1 = new double[5]; 格式 3 : • 資料類型 [ ] 數組名 = new 資料類型 []{ 數組元素清單 }; • 數組元素清單包含數組中所有元素,中間用 , 分割 • int [ ] arr = new int [ ]{1,3,5,7,9}; • long[ ] arr1 = new long [ ] {2,4,6L,8,10L}; 格式 4 : • 資料類型 [ ] 數組名 = { 數組元素清單 }; • int [] arr = {1,3,5,7,9}; 不能分開指派 這裡的資料類型就是元所擁有的類型,常見的類型有整型、浮點型和字元型,數組名是使用者自己定義的合法的辨別符,用來統一這組相同資料類型的元素名稱,其命名規範和變量相同,[ ]表示這是一個數組,數組一旦被定義,它的資料類型和數組名就不可更改。以上聲明數組的文法格式都對,但是建議大家采用第一種例如:int [ ] arrayName;就表示為int類型的一維數組,這樣可以增加代碼的可讀性。 數組初始化: 由于數組數組不過是一種特殊的類,Java中在數組聲明時并不為數組配置設定空間,是以在聲明的[ ]中不能指出數組中元素的個數即數組的長度,是以聲明之後并不能立即使用,必須經過初始化并配置設定存儲空間後,才能通路數組元素,為數組配置設定存儲空間有兩種方式:初始化和使用關鍵字new。 數組的初始化指的是在聲明數組的同時為其元素賦初值,它的初始化格式如下: 資料類型 數組名 [ ] = {值1,值2,.....,值n};"{ }"中是初始化表,在聲明時,并不需要将數組元素的個數列出,編譯器根據所給出的初值個數來判斷數組的長度,為這個數組配置設定足夠的記憶體空間,并在這些空間中依次填入這些值,例如: int array[ ] = {0,1,2,3,4,5,6,8,9}; double day[ ] = {10.2,45.9,65.0,55.4}; 在上面的語句中聲明了一個整型數組array,雖然沒有特别指明數組的長度,但由于大括号裡的初值有9個,編譯器會按從0~8的順序将各元素進行存放,arr[0]為0,arr[1]為1,....,arr[8]為9,java中任何一個長度為n的數組,它的下标總是0,最後一個元素的下标總是n-1。 使用關鍵字new 通過使用new運算符可以為數組配置設定空間和指定初值,它的一般形式是: 資料類型 數組名 [ ]; 數組名 = new 數組類型 [數組長度]; 或将聲明與建立寫在一起: 資料類型 數組名[ ] = new 資料類型 [數組長度]; 其中資料類型和數組名與聲明時的相同,數組聲明後,接下來便是要配置數組所需的記憶體,其中"數組長度"是告訴編譯器,所聲明的數組要存放多少個元素,而"new"則是指令編譯器根據括号裡的資料個數,在記憶體中開辟一塊記憶體空間供該數組使用。例如: int a[ ]; a = new [5]; double [ ] b = new double [10]; 一旦數組初始化或用new為數組配置設定了存儲空間以後,該數組的長度即被固定下來,不能在進行改變,除非在建立一個數組,重新配置設定存儲空間。 !注意:對同一個數組再次動态配置設定空間時,即用new運算符建立,若該數組的存儲空間沒有進行另外的存儲,那麼該數組的資料将會丢失。例如: int array [ ] = {11,12,13,14,15}; array = new int [10];在這裡通過new運算符為array數組重新配置設定空間,那麼它原來的11,12,13,14,15将丢失。 引用 要引用一個數組,其實使用的是這個數組中的元素,想要使用數組裡的元素,可以利用索引來完成,Java中的數組索引标号由0開始到數組長度-1為止數組元素使用形式: 數組名[下标] [ ] 中的下标是介于[0,數組長度-1]之間的整型數,也可以是byte、short、char等類型,但是不允許為long型,當然下标也可以是合法的表達式。 如果要直接通路某數組中的最後一個元素,這時就需要用到數組的一個屬性:length,它是一個特殊的屬性,表示數組共有多少個元素,也是數組的長度,使用者程式無法直接改變這個值,它的具體用法是:數組名.length,來看一個一維數組的使用方法的程式:
class ArrayClass
{
public static void main(String[] args)
{
int i;
int [] arr = new int [10];//聲明數組并指派開辟空間
System.out.println("數組長度是: "+arr.length);//輸出數組長度
for (i=0;i<10;i++)//輸出數組的元素内容。
{
System.out.print("a["+i+"]="+arr[i])+",");
if (i%2==1)//控制列印行數,每行列印2個元素
{
System.out.println();
}
}
}
}
運作結果:數組長度是:10
a[0] =0;a[1]=0;
a[2] =0;a[3]=0;
a[4] =0;a[5]=0;
a[6] =0;a[7]=0;
a[8] =0;a[9]=0;
上述代碼聲明了一個整型數組arr并用new運算符為其配置設定空間,其元素個數為10,然後利用for循環輸出數組内容。由于程式中沒有賦具體值,是以數組元素指向了int的預設值0,是以輸出為0。arr .ength代表數組的長度為10,也就說數組元素個數是10個。 二維數組的概念 二維數組可以看做是一種特殊的一維數組,即數組中的元素全部是一維數組 二維數組中儲存的一維數組必須結構相同,即儲存的數組存儲的資料類型必須完全相同 二維數組的長度僅僅表明其中儲存的一維數組的數量,并不能限制其中儲存的一維數組的長度 二維定義格式: 聲明有3種: 資料類型 數組名[ ] [ ] 或者資料類型 [ ] [ ] 數組名 或者資料類型[ ] 數組名[ ] 它可以是簡單的資料類型,也可以是複合類型,和一維數組一樣,兩個“[ ]”中都必須是空的。二維數組的合法聲明形式: int a [ ] [ ]; double [ ] [ ] b; myClass [ ] c [ ]; 初始化: 二維數組的初始化同一維數組一樣,在聲明數組的同時為資料元素賦初值: 二維數組聲明的方式和一維數組類似,記憶體的配置設定也一樣用new這個關鍵字。與一維數組不同的是,二維數組在配置設定記憶體時,必須告訴編譯器二維數組的行與列的個數,“行的個數”是告訴編譯器所聲明的數組多少行(行指的是一維數組的個數);“列的個數”則是說明該數組有多少列(一個一維數組中有多少個元素);例如: int a [ ] [ ] = new int [4] [6]; z這裡建立了一個4行6列的整型二維數組a,它仍然由4個一維數組組成,每個一維數組的長度都是6。 格式 2 : • 資料類型 [] [] 數組名 = new 資料類型 [ 長度 ] [ 長度 ]; • int [][] arr = new int [4][5]; • double [][] arr1 = new double[5][10]; 格式 3 : • 資料類型 [][] 數組名 = new 資料類型 [][]{{ 數組元素清單 1},{ 數組元素清單 2},……}; • int [][] arr = new int [][]{{1,3},{7,9}}; • long[][]arr1 = new long[][] {{2,4},{6L,8},{10L,12L}}; 格式 4 : • 資料類型 [][] 數組名 = {{ 數組元素清單 1}, { 數組元素清單 2},……}; 不能分開指派 • int [][] arr = {{1,3},{5,7}}; 格式 5 : • 資料類型 [][] 數組名 = new 資料類型 [ 長度 ][]; • 數組名 [ 索引 ] = new 資料類型 [ 長度 ]; • 先對二維數組外層數組的長度進行初始化,然後再對其中儲存的資料即内層一維數組進行單獨初始化 • 使用此格式可以建立出特殊的二維數組,即其中儲存資料的一維數組長度均不相同 • 此格式更有利于對現實生活中的資料進行描述 !注意: 由于二維數組可以看作是一維數組的數組,是以數組的記憶體空間不一定是連續的,是以不要求二維數組中每一維的大小必須相同。
引用 :
Java是通過以下方式來引用二維數組的元素的,引用形式為;
數組名 [行号] [列号] 例如:
n = a[3][4]; 表示要通路二維數組a的第4個一維數組中的第5個元素,如果要通路是以元素中的第一個應該這麼些:n = a[0] [0];
如果要直接通路是以元素中的最後一個,要這麼寫:
r = a.length-1;
c1 =a[r].length-1;
k = a[r] [c1];
!注意:不管在多元數組中還是在一維數組中,下标都是從0開始到數組的長度-1為止
數組名.length //取得數組的行号即一維數組的個數。
數組名[行的索引].length //取得特定行元素的個數即指定的一維數組内的元素的個數。
下面是關于二維數組使用方法的程式:
class ArrayClass_2
{
public static void main(String[] args)
{
int i,j,sum=0;
int score[][]={{60,70,85,45},{89,78,86,66},{56,84,76,91}};//聲明數組并設定初值
for (i=0;i<score.length;i++ )
{
sum = 0;
System.out.println("第"+(i+1)+"個人成績為:");
for (j=0;j<score[i].length ;j++)
{
System.out.println(score[i][j]+" ");//輸出個人單科成績
sum+=score[i][j];//計算總成績
}
System.out.println("總成績為: "+sum);
}
}
}
運作結果:
第1個人的成績為:60 70 85 45 總成績為:260
第2個人的成績為:89 78 86 66 總成績為:319
第3個人的成績為:56 84 76 91 總成績為:307
上面這段程式利用整數變量i、j作為外層循環與内層循環控制變量及數組的下标,變量i控制行的個數,變量j控制一行中列的個數;而sum則用來存放是以數組元素的和,也就是總成績。
數組最值
數組的最值可通過對數組中元素周遊,逐一比對,最終找到數組元素的最值 在進行數組最值的求解過程中,盡量避免使用固定值對數組元素進行比對,避免出現特殊值影響最終結果,可以改變資料儲存的方式,使用索引作為儲存的資料,完成求最值元素對應的下标的形式來避免上述問題
class ArrayDemo2{
public static void main(String[] args){
//數組求最值
//思路
//兩兩相比,留一個大的,再與下面的所有的
//數重複兩兩相比,直到所有的數字全部比完
int[] arr = {4,2,6,8,11,3,9};
int max = 0;
//周遊數組,使用每一個元素與max相比
//如果比較的值比max小,跳過
//如果比較的值比max大,将max改成比較的值
//對數組循環完畢後,max就是最大值
for(int i = 0;i<arr.length;i++){
if(max<arr[i]){
max = arr[i];
}
}
System.out.println(max);
}
數組排序
數組排序是數組的常用操作,數組排序方式有多種 • 冒泡排序法 交換排序法 選擇排序法 • 插入排序法 基數排序法 希爾排序法 • 快速排序法 歸并排序法 堆排序法
選擇排序
選擇排序法是将原始數組空間分為兩個部分,第一部分用于存放已經排序完成的資料,第二部分用于存在未完成排序的資料 排序過程中,每次從未完成排序
的區域中找出最大/小值并将其放
置到未完成排序區域的首位,然
後改變兩個區域的空間大小,并
反複上述過程,直到未排序區隻
有一個資料
/*
數組的排序
選擇排序法
選擇排序法改良
*/
class SortDemo2{
public static void main(String[] args){
/*
int[] arr = {4,26,51,38,3,45,69,87,70,92};
for(int x = 0 ; x<arr.length -1 ;x++){
//一輪
//使用第一個作為參考值,然後與後面的每個元素進行比較,大就換
for(int i = x+1 ;i<arr.length;i++){
if(arr[x]>arr[i]){
int temp = arr[x];
arr[x] = arr[i];
arr[i] = temp;
}
}
}
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i]);
}
*/
int[] arr = {4,26,51,38,3,45,69,87,70,92};
//一輪
//設定0号為參考值
for(int x = 0;x < arr.length-1;x++){
int temp = x;
//使用參考值與1号比,誰大誰做參考值
for(int i = x+1; i < arr.length ;i++){
if(arr[temp]<arr[i]){
temp = i;
}
}
//交換
//0位置與temp位置交換
int temps = arr[x];
arr[x] = arr[temp];
arr[temp] = temps;
}
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
冒泡排序
冒泡排序法是較為常用的排序方法,日常生活中大多數的排序方案均為冒泡排序法 排序過程中,使用第一個元素與第二個元素
進行比較,并将其較大/小的放在後面,然後
使用第二個與第三個元素進行比較,重複上
述操作,當數組周遊一輪時,最大/小的元素
将置于數組末端;第二輪,改變周遊數組範
圍,從第一個元素到倒數第二個元素,對其
進行上述操作;第三輪對第一個元素到倒數
第三個元素進行上述操作,如此反複,最終
對數組實作排序
class SortDemo{//冒泡排序法
public static void main(String[] args){
int[] arr = {4,2,6,1,8,3,5,9,7,0};
//找出最大的,把最大的放到隊尾
for(int i = 1 ;i<= arr.length - 1;i++){
for(int j = 0;j<arr.length - i;j++){
//比較兩個相鄰的資料,如果前面的大,交換位置
if( arr[j] > arr[j+1]){
//資料交換
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
減少排序過程中資料移動次數
排序過程中需要進行大量的元素位置對調的操作,這一操作将開銷大量的運算時間,通過添加額外的資料存儲區域,可以減少資料移動操作次數,此操作思想與求最值操作過程中使用的額外變量具有相同的功效
數組元素查找
數組中元素衆多,最快速度的查找出需要的資料成為數組操作中的一個重要操作,常用查找方式如下 二分法查找 索引查找法 哈希查找法 二分法查找 二分法查找又名折半查找法,首先要保障要查詢的資料是有序的,然後與資料總量一半位置處的資料進行比對,以升序排列為例,如果比對的結果發現查找資料比比對資料大,則在後半段再次重複上述操作,直到找到最終的資料。如果原始資料中不包含要查找的資料,資料查找将失敗,通常傳回一個固定的值 -1 作為查找失敗的結果。
/*
二分法查找
*/
class QueryDemo{
public static void main(String[] args){
//查找得到的一定是對應所在的位置
int num = 9;
int[] arr = {1,2,3,4,5,6,7,8,9};
int min = 0;
int max = arr.length-1;
while(min<max){
//比對值對應的索引
int mid = (min+max)/2;
//使用你要查找的資料域要比對的索引上的資料進行比對
if(num > arr[mid]){
//min要移動到mid+1,max不動
min = mid + 1;
}else if(num < arr[mid]){
//max要移動到mid-1,min不動
max = mid - 1;
}else{
System.out.println(mid);
break;
}
}
}
}
關于數組暫時總結出這些,歡迎各位批評指正!
----------------- android教育訓練、java教育訓練、期待與您交流!------------------
詳細請檢視:http://edu.csdn.net