數組操作

複製數組
Java在System類中提供了一個特殊的方法arraycopy(),用於實現數組之間的複製操作。
本示例將演示數組的複製功能,操作步驟如下。
(1)創建CopyArray類,在main()方法中輸入以下程序關鍵代碼。
src/com/wsy/CopyArray.java關鍵代碼:
int i;
int arr1[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};                                //源數組
int arr2[] = new int[10];                                                //複製數組
System.arraycopy(arr1, 0, arr2, 0, arr1.length);                        //將arr1數組複製到arr2數組
for (i = 0; i < arr2.length; i++)
    System.out.print(arr2[i] + ",");                                  //打印arr2數組
System.out.println();
代碼說明如下。
其實數組在Java中可以看作一個對象,數組的引用和數組的實例也是分開的,所以如果希望複製整個數組的數據時,就不能簡單地使用指定語句,因爲這樣訪問的還是同一個數組。不過雖然數組有點像對象,但是數組畢竟不是繼承自java.lang.Object類的對象,所以就沒有clone()這個用來複制對象實例的方法。
可以自己利用循環來做數組的複製,例如有arrayA、arrayB兩個數組,現在要將arrayA數組中的數據複製到arrayB數組中:
for (i=0;i<arrayA.length;i++)
      arrayB[i]=arrayA[i];
其實也不難,一個for循環語句就可以了。不過Java中也提供了一個方法來複制一個數組,就是“System.arraycopy”方法。例如:
語法:
System.arraycopy (arrayA,0,arrayB,0,a.length);
arrayA:來源數組名稱。
0:來源數組起始位置。
arrayB:目的數組名稱。
0:目的數組起始位置。
arrayA.length:複製來源數組元素的個數。
使用arraycopy這個方法時,需要上述5個參數,依序是來源數組、來源數組數據起始位置、目的數組、目的數組數據起始位置、複製數組個數。由這些參數可知這個方法在使用上非常有彈性。
如果只想把arrayA數組中的第1、2、3位置的數據拷貝到arrayB數組中的第2、3、4的位置上,那麼可以改寫如下:
語法:
System.arraycopy(arrayA,1,arrayB,2,3);
arrayA:來源數組名稱。
1:來源數組起始位置爲第二個元素。
arrayB:目的數組名稱。
2:目的數組起始位置爲第3個元素。
3:在來源數組第二個元素開始複製3個元素。
如果需要將來源數組和目的數組都指定爲同一個數組,或是說引用到同一個數組時,Java會複製一份臨時數組,然後根據參數的要求,再從剛纔產生的臨時數組拷貝回來,所以不會造成讀和寫的衝突。
使用循環對數組做複製操作與使用System.arraycopy方法對數組做複製操作最大的差別在於System.arraycopy這個方法速度上會比較快。


排序數組
在Java中爲數組中的元素排序需要使用sort()這個方法。該方法是java.util類庫中的Arrays類。
Arrays類中有一系列方法,提供了操作數組的實用功能,其中包括的方法有:equals()、fill()、binarySearch()、asList(),equals()比較兩個數組是否相等,fill()向數組填充整個數組,binarySearch()在排好序的數組中查找元素,asList()的參數是任何類型的數組,將數組轉化爲List容器。
Arrays類可以協助Java用戶操作數組,它提供了幾個方法:
sort()
 快速排序
binarySearch()
 對已經排序好的數組進行二叉搜索,如果找到結果返回該元素的索引值,否則返回負值
fill()
 填充數組
equals()
 比較數組中的元素值是否相等,如果是返回true,否則返回false
 
主要使用Arrays類中的sort()方法,該方法的參數爲任意基本類型的數組,也可以對任意對象數組進行排序。
數組排序在操作數組中應用廣泛,使用Arrays類調用,例如:
語法:
Arrays.sort(a);
a:排序數組名稱。

import java.util.Arrays;
public class SortArray {
      public static void main(String[] args) {
            String []s=new String[]{"abc","ABC","EDF","234"};
            Arrays.sort(s);
System.out.println(Arrays.asList(s));
      }
}
代碼說明如下。
上述代碼中定義了一個字符型數組,其中包括4個元素,包括大寫字母、小寫字母、數字,若想對這個數組進行排序,使用的是先前提到的sort()方法,參數爲數組s,排序後打印數組s,此時可以使用for循環語句對數組進行打印,但Arrays類庫爲用戶提供了更爲方便的打印形式,使用asList()方法,參數爲需要打印的數組名稱。


Java中的String排序算法是根據字典編排順序排序的,所以數字排在字母前面,大寫字母排在小寫字母前面。如果想忽略大小寫字母將單詞放在一起排序,可以修改上述代碼。

下面是一個忽略字符串大小寫排序的例子,操作步驟如下。
(1)創建SortArray2類,在main()方法中輸入以下程序關鍵代碼。
src/com/wsy/SortArray2.java關鍵代碼:
String[] sa=new String[]{"b","C","a","234"};
Arrays.sort(sa, new SingleCompare());                      //忽略大小寫給數組sa排序
System.out.println(Arrays.asList(sa));                       //打印數組sa
(2)在SortArray2類中創建類SingleCompare,關鍵代碼如下:
src/com/wsy/SortArray2.java關鍵代碼:
public class SingleCompare implements Comparator{
    public int compare(Object o1,Object o2){   //重寫compare方法
        String s1=(String)o1;
        String s2=(String)o2;
        return s1.toLowerCase().compareTo(s2.toLowerCase());
                                                           //將字符串s1、s2大寫轉化爲小寫後行比較
    }
}
代碼說明如下。
在上述代碼中實現了Comparator接口,該接口強行對某些對象進行整體排序,可以將Comparator傳遞給sort()方法,從而允許在排序上實現精確控制。Comparator有兩個方法,分別爲compare()方法和equals()方法,可以重寫compare()方法實現自己需要的比較,例如上述代碼中比較兩個字符串的大小寫情況,在這裏使用了String類中的toLowerCase()方法,此方法將字符串中的大寫字母轉換爲小寫字母,將字符串從大寫字母轉換爲小寫字母后再進行比較,然後將比較結果傳遞給sort()方法進行排序。
compare()方法返回負數、零、或正整數,分別對應於第一個參數小於、等於或大於第二個參數。


比較數組
Arrays類提供了equals()方法,用來比較整個數組,數組相等的條件是數組元素的個數必須相等,並且對應的位置元素也相等,這時候可以通過對每個元素使用equals()方法作比較來判斷。例如:
語法:
Arrays.equals(arrayA,arrayB);
arrayA:待比較數組名稱。
arrayB:待比較數組名稱。
(1)創建ComparingArrays類,在main()方法中輸入以下程序關鍵代碼。
src/com/wsy/ComparingArrays.java關鍵代碼:
int[]a1={1,2,3,4,5,6,7,8,9,0};
int[]a2=new int[9];
System.out.println(Arrays.equals(a1, a2));                        //打印數組a1與a2的比較結果
int[]a3={1,2,3,4,5,6,7,8,9,0};
System.out.println(Arrays.equals(a1, a3));                        //打印數組a1與a3的比較結果
int[]a4={1,2,3,4,5,6,7,8,9,5};
System.out.println(Arrays.equals(a1, a4));                        //打印數組a1與a4的比較結果
上述代碼中定義了3個數組,第一個數組直接給出數組的值,聲明和初始化放在一起,從筆者給出的數值可以看出數組a1的長度爲10,而定義的第二個數組的長度爲9,所以使用Arrays.equals()方法進行比較後結果爲false。再次定義一個與a1相同的數組a3,比較後結果爲true,這時筆者再次定義一個數組a4,數組a4與數組a1元素個數相同,元素內容不同,比較數組a1與a4結果爲false。


搜索數組
搜索數組中的元素需要使用binarySearch()這個方法,此方法也爲Arrays的一系列方法之一。
在使用binarySearch()方法之前有一點要非常值得注意,就是被查找的數組必須是已經排序好的,因爲此時是二叉樹查找,這個二叉樹必須是排序過的,這樣查找出來的結果纔會有意義。如果找到了需要查詢的結果,binarySearch()方法返回值爲需要查找的內容在數組中的位置,如果沒有查找到要找的數據,那麼返回一個“負數”,至於這個負數的值會是多少,就看這棵二叉樹下一個插入位置的索引值是多少了。
Arrays類引用binarySearch方法,例如:
語法:
int i=binarySearch(a,"abc");
a:搜索數組的名稱。
abc:需要在數組中查找的內容。
int[] a={1,2,3,4,1,2,3};
Arrays.sort(a);                                   //將數組a排序
Arrays.binarySearch(a, 4);                         //查找數值4在數組a中的位置
System.out.print("排序後的數組爲:");
for(int i=0;i<a.length;i++){
    System.out.print(+a[i]+" ");                 //打印排序後的數組a
}
System.out.println();
    int location=Arrays.binarySearch(a, 4);      
    System.out.println("查找4的位置是"+location+",a["+location+"]="+a[location]);
                                                     //打印數值4在數組a中的位置以及對應的元值
}
代碼說明如下。
上述代碼中首先定義了一個int型數組,然後筆者使用了sort()方法對此數組進行排序,因爲只有排序後才能進行查找工作,爲了使4在數組中位置更加清晰,筆者將排序後的數組打印,然後進行查找,返回一個int型變量即爲4在數組中的位置。
如果排序時使用了comparator,那麼在搜索時也要使用comparator。
(1)創建SearchArray2類,在main()方法中輸入以下程序關鍵代碼。
src/com/wsy/SearchArray2.java關鍵代碼:
String[] a={"1","2","3","4","1","2","3"};
Arrays.sort(a, new SingleCompareNew ());                //忽略數組中大小寫後對數組進行排序
System.out.print("排序後的數組爲:"); 
for(int i=0;i<a.length;i++){
    System.out.print(a[i]+" ");                          //打印數組
}
System.out.println();
    int location=Arrays.binarySearch(a, "4", new SingleCompareNew ());
    System.out.println("查找4的位置是"+location +",a["+location+"]="+a[location]);
(2)在SearchArray2類中定義一個類SingleCompareNew,程序代碼如下:
src/com/wsy/SearchArray2.java關鍵代碼:
class SingleCompareNew implements Comparator{
    public int compare(Object o1,Object o2){                     //重寫compare()方法
        String s1=(String)o1;
        String s2=(String)o2;
        return s1.toLowerCase().compareTo(s2.toLowerCase());
    }
}
定義一個類SingleCompareNew,此類實現了Comparator接口,此時需要重寫Comparator內的compare()方法,在排序時使用sort(數組名稱,new Comp()),正因爲在排序時候使用了這樣的限制,所以在搜索時也需要提供同樣的Comparator。


填充數組
Arrays類庫中爲用戶提供填充數組的方法爲fill()方法,雖然可以填充數組,但此方法的功能有限,只能使用同一個數值進行填充,但此方法可以在指定位置進行填充。
Arrays類引用fill()方法實現填充數組,例如:
語法:
int array[]=new int[10];
Arrays.fill(array,11);
array:將被填充數組的名稱。
上述代碼意在將數值11填充到數組a中。
創建FillingArrays類,在main()方法中輸入以下程序關鍵代碼。
src/com/wsy/FillingArrays.java關鍵代碼:
int size=0;
if(args.length!=0)
    size=Integer.parseInt(args[0]);                    //取第一個參數的值
int[]a1=new int[size];
Arrays.fill(a1, 11);                                    //將數值11填充到數組a1中
for(int i=0;i<a1.length;i++){
    System.out.print("a1["+i+"]="+a1[i]+" ");            //打印數組a1
}
System.out.println();
在上述代碼中定義一個int型數組,此數組的長度爲size變量,此變量的值爲用戶在終端輸入而定,Java爲主函數提供了一個數組參數,此數組用來接收用戶在終端上輸入的值,args[0]代表用戶輸入的第一個值,args[1]代表用戶輸入的第二個值,以此類推。


傳遞數組
數組名稱實際上就是一個引用,所以傳遞數組實質上就是傳遞引用。當方法傳遞引用時,只需在方法參數中指定引用的名稱即可。
將數組傳遞給方法,應該使用不加方括號的數組名,例如:
語法:
int array[] = new int[24];     // 聲明一個數組
modify(array);               // modify方法調用
array:要傳遞的數組名稱。
上述代碼是在方法調用時的寫法,如果是定義一個方法,參數爲數組,例如:
語法:
void modifyArray(int b[]){}
b:參數。
這表示modifyArray()方法正準備接收一個整型數組,名稱爲b。
int array[]={1,2,3,4,5};
for(int i=0;i<array.length;i++){
    System.out.println("沒有傳值之前的數組爲:"+array[i]); //打印沒有調用modifyArray()方法的數組值
}
modifyArray(array);                                                //調用方法
for(int i=0;i<array.length;i++){
    System.out.println("傳遞之後數組的數組爲:"+array[i]); //打印調用modifyArray()方法後的數值
}
在PassArray類中定義一個modifyArray()方法,它的參數爲數組,程序代碼如下:
src/com/wsy/PassArray.java關鍵代碼:
public static void modifyArray (int array[]){
    for(int i=0;i<array.length;i++){
        array[i]*=2;                                                  //將數組array中的每個
素都乘以2
    }
}

代碼說明如下。

l         首先創建一個方法modifyArray(),參數爲int型數組,在該方法內使用for循環語句將傳遞過來的數組中每一個數乘以二。

l         在主函數中定義一個數組,打印沒有改變之前的數組的值。

l         調用modifyArray()方法,由於modifyArray()方法爲static的,所以在主函數中可以直接調用。

l         改變數組值後,打印數組。

發佈了42 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章