常用的對數組進行的操作 1、求數組中最大值,最小值 思路:假設下標為0的元素是最大值,遍曆數組,依次跟max進行比較,如果有元素比這個max還大,則把這個值賦給max。最小值同樣 2、查找數組中是否存在某個元素 (2)、用二分查找法查找數組中是否存在某個元素 前提:待查找的數組必須是有序的(大小有序 ...
常用的對數組進行的操作
1、求數組中最大值,最小值
思路:假設下標為0的元素是最大值,遍曆數組,依次跟max進行比較,如果有元素比這個max還大,則把這個值賦給max。最小值同樣
1 public class TestArray{ 2 public static void main(String[] args){ 3 int[] arr={23,45,234,576,34,87,34,12,67}; 4 int max=arr[0]; 5 int min=arr[0]; 6 for(int i=0;i<arr.length;i++){ 7 if(arr[i]>max){ 8 max=arr[i]; 9 } 10 if(arr[i]<min){ 11 min=arr[i]; 12 } 13 } 14 System.out.println("數組中最大值為:"+max); 15 System.out.println("數組中最小值為:"+min); 16 } 17 }
2、查找數組中是否存在某個元素
1 import java.util.Scanner; 2 public class TestArray{ 3 public static void main(String[] args){ 4 Scanner in=new Scanner(System.in); 5 int[] arr={23,45,234,576,34,87,34,12,67}; 6 System.out.println("請輸入你要查找的元素"); 7 int element=in.nextInt(); 8 int i,flag=0; 9 for(i=0;i<arr.length;i++){ 10 if(arr[i]==element){ 11 flag=1; 12 break; 13 } 14 } 15 if(flag==1){ 16 System.out.println("你要查找的元素的下標為:"+i); 17 }else{ 18 System.out.println("你要查找的元素不存在"); 19 } 20 } 21 }
(2)、用二分查找法查找數組中是否存在某個元素
前提:待查找的數組必須是有序的(大小有序)
原理:將待查找的元素與數組中中間下標的元素進行比較,如果大於中間元素,去右邊查找,小於中間元素,去左邊查找。
1 public static int binarySearch(int[] arr,int ele){ 2 int left=0; 3 int right=arr.length-1; 4 int mid; 5 int index=-1; 6 while(left<=right){ 7 mid=(left+right)/2; 8 if(arr[mid]==ele){ 9 index=mid; 10 break; 11 }else if(arr[mid]<ele){ 12 left=mid+1; 13 }else if(arr[mid]>ele){ 14 right=mid-1; 15 } 16 } 17 return index; 18 }
3、對數組進行排序
(1)、冒泡排序
原理:相鄰元素進行比較,小的往前趕,大的往後冒,最大值出現的最大索引處
分析:第一次進行比較,大的往後冒,會把最大值排在最大索引處
第二次進行比較,因為最大值已經確定了,只需要比較前n-1個元素即可,確定一個第二大值排在第二大索引處
依次確定第三大值,第四大值.............
結論:N個數字來排隊,兩兩比較小靠前,外層迴圈n-1,內層迴圈n-1-i
1 public class TestArray{ 2 public static void main(String[] args){ 3 int[] arr={10,3,8,1,6}; 4 //外層迴圈控制比較輪數 5 for(int i=0;i<arr.length-1;i++){ 6 //內層迴圈控制每輪比較次數 7 for(int j=0;j<arr.length-1-i;j++){ 8 if(arr[j]>arr[j+1]){ 9 int temp=arr[j]; 10 arr[j]=arr[j+1]; 11 arr[j+1]=temp; 12 } 13 } 14 } 15 //遍曆數組 16 for(int i=0;i<arr.length;i++){ 17 System.out.println(arr[i]); 18 } 19 } 20 }
(2)、選擇排序
原理:從下標0處開始,依次和後邊的元素進行比較,如果後面元素小於下標0的元素,換位。拿新的下標為0的元素和後邊的進行比較。第一次完畢,最小值出現在索引0處
例:{10,3,8,1,6}
第一輪比較,從0下標元素開始,依次和後邊的元素進行比較,先是10和3進行比較,10<3,交換位置,下標0的元素變成3,{3,10,8,1,6};再拿3和8比較,3<8,不換位;3和1進行比較,3>1,換位
{1,10,8,3,6},然後拿1和6進行比較,1<6,不換位置。第一輪結束,{1,10,8,3,6}
第二輪比較,上一輪已經確定了下標0的元素為最小值,這輪比較從下標1開始,先是10和8比較,換位{1,8,10,3,6};8和3比較,換位{1,3,10,8,6},3和6比較,不換位。第二輪結束,確定倒數第二小的元素在下標1位置。
........
共比較length-1輪。
1 public class TestArray{ 2 public static void main(String[] args){ 3 int[] arr={10,3,8,1,6}; 4 for(int i=0;i<arr.length-1;i++){ 5 for(int j=i+1;j<arr.length;j++){ 6 if(arr[i]>arr[j]){ 7 int temp=arr[i]; 8 arr[i]=arr[j]; 9 arr[j]=temp; 10 } 11 } 12 } 13 //遍曆數組 14 for(int i=0;i<arr.length;i++){ 15 System.out.println(arr[i]); 16 } 17 } 18 }
4、刪除數組中元素
(1)根據下標刪除元素(空位補0)
1 public static void delete(int[] arr,int index){ 2 for(int i=index;i<arr.length-1;i++){ 3 arr[i]=arr[i+1]; 4 } 5 arr[arr.length-1]=0; 6 System.out.println(Arrays.toString(arr)); 7 }
(2)根據輸入的元素刪除數組中對應的元素
1 public static void delete(int[] arr,int ele){ 2 int index=-1; 3 for(int i=0;i<arr.length;i++){ 4 if(arr[i]==ele){ 5 index=i; 6 } 7 } 8 for(int i=index;i<arr.length-1;i++){ 9 arr[i]=arr[i+1]; 10 } 11 arr[arr.length-1]=0; 12 System.out.println(Arrays.toString(arr)); 13 }
下麵介紹一些API裡面常見的對數組的操作
在java中,除java.lang包下的類和介面可以直接使用外,其他包下的類或介面在使用時需要先導包。
java.util.Arrays類:此類包含用來操作數組(比如排序和搜索)的各種方法。
這些都是靜態方法,可以類名.方法名直接使用,這裡都以int型數組為例
1、對數組進行快速排序
Arrays.sort(int[] arr);對傳入的數組預設進行升序排序
2、返回指定數組內容的字元串表現形式。
Arrays.toString(int[] arr);
3、使用二分法搜索制定數組中的某個元素的下標
Arrays.binarySearch(int[] arr);
4、將將指定的 int 值分配給指定 int 型數組的每個元素。
Arrays.fill(int[] arr,int val);
5、複製指定的數組,截取或用 0 填充(如有必要),以使副本具有指定的長度。
Arrays.copyOf(int[] arr,int newLength);它的返回值是一個數組
6、將指定數組的指定範圍複製到一個新數組。 包含起始位置但不包含結束位置。
Arrays.copyOfRange(int[] arr,int from,int to);它的返回值是一個數組
其他數組知識:
1、命令行參數:可以在執行java命令時為main方法傳入參數值。
用法:運行java命令時傳入命令行參數: java 類名 "值1" "值2"...
public static void main(String[] args){},我們可以看到main方法是一個有參的方法,參數是一個字元串數組,在命令行為main方法傳值時,傳入的值都保存在args字元數組裡。
註意:多個參數值之間用空格分割。參數的值將會保存到字元串數組傳入main方法,下標從零開始。
在獲取命令行參數時需要註意下標不能越界,最大下標應該為參數的個數-1
public static void main(String[] args){ 2 for(int i=0;i<args.length;i++){ 3 System.out.println(args[i]); 4 } 5 }
2、可變參數
可變參數是java1.5之後的新特性,可以代表零到多個相同數據類型的變數,是為瞭解決因參數個數的變化而導致過多的方法重載問題。
註意:1、可變參數只能用於形式參數(方法定義時),可以把可變參數當作數組來處理。
2、一個方法在最多只能有一個可變參數,可變參數必須作為最後一個參數。
3、調用帶可變參數的方法時,數據類型必須與可變參數的類型對應。
1 public class Test1 { 2 public static void main(String[] args){ 3 double sum=add(4,2.1,3.4,1.2); 4 System.out.println(sum); 5 } 6 public static double add(int a,double...b){ 7 double sum=a; 8 for(int i=0;i<b.length;i++){ 9 sum+=b[i]; 10 } 11 return sum; 12 } 13 }
例題:
- 合併數組操作:現有如下一個數組: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} 要求將以上數組中值為0的項去掉,將不為0的值存入一個新的數組,生成的新數組為: int newArr [] ={1,3,4,5,6,6,5,4,7,6,7,5}
思路: 確定出不為0的個數,這樣可以開闢新數組;從舊的數組之中,取出內容,並將其賦給新開闢的數組。
1 public class Test1 { 2 public static void main(String[] args){ 3 int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; 4 int[] arr=mergeArrays(oldArr); 5 System.out.println(Arrays.toString(arr)); 6 } 7 public static int[] mergeArrays(int[] oldArr){ 8 int count=0; 9 for(int i=0;i<oldArr.length;i++){ 10 if(oldArr[i]!=0){ 11 count++; 12 } 13 } 14 int[] newArr=new int[count]; 15 int index=0; 16 for(int i=0;i<oldArr.length;i++){ 17 if(oldArr[i]!=0){ 18 newArr[index]=oldArr[i]; 19 index++; 20 } 21 } 22 return newArr; 23 } 24 }
2、使用二分法查找有序數組中元素。找到返回索引,不存在輸出-1。使用遞歸實現
1 public class Test1 { 2 public static void main(String[] args){ 3 int[] arr={1,2,3,4,5,6,7,8}; 4 int index=binarySearch(arr,6,0,arr.length-1); 5 System.out.println(index); 6 } 7 public static int binarySearch(int[] arr,int ele,int left,int right){ 8 int mid=(left+right)/2; 9 if(arr[mid]==ele){ 10 return mid; 11 }else if(arr[mid]<ele){ 12 return binarySearch(arr,ele,mid+1,right); 13 }else if(arr[mid]>ele){ 14 return binarySearch(arr,ele,left,mid-1); 15 } 16 return -1; 17 } 18 }