---------------------- android培訓、java培訓、期待與您交流! ----------------------
數組常見問題及操作
數組中常見異常有:
數組腳標越界異常(ArrayIndexOutOfBoundsException) |
int[] arr = new int[2]; System.out.println(arr[3]); 訪問到了數組中的不存在的腳標時發生。 |
空指針異常(NullPointerException) |
int[] arr = null; System.out.println(arr[0]); arr引用沒有指向實體,卻在操作實體中的元素時。 |
數組的操作:
獲取數組中的元素,通常採用遍歷。
數組中有一個屬性可以直接獲取到數組元素個數:length。
//使用方式,數組名稱.length
int[] arr ={1,1,2,3,4,5,6}; System.out.println("數組的長度length="+arr.length); |
打印數組的簡單函數
public static void printArray(int[] arr) { System.out.print("["); for (int x=0;x<arr.length ;x++ ) { if(x!=arr.length-1)//判斷是否是最後一個元素,不是最後一個,帶逗號。 System.out.print(arr[x]+", "); else//若是最後一個元素,打印不帶逗號,切可以換行。 System.out.println(arr[x]+"]"); } } |
獲取數組最值
//第一種方式,直接獲取最大值。 public static int getMax(int[] arr) { int max = arr[0];
for (int x=1;x<arr.length ;x++) { if(arr[x]>max) max = arr[x]; } return max;
} //另一種方式,獲取最大元素的腳標, public static int getMax2(int[] arr) { int max =0; for (int x=0; x<arr.length;x++) { if(arr[x]>arr[max]) max = x;//記錄最大元素的腳標。 } return arr[max]; } |
//間接獲取最小值。腳標。 public static int getMin(int[] arr) { int min = 0; for (int x=1;x<arr.length; x++) { if(arr[x]<arr[min]) min=x; } return arr[min]; }
//直接獲取,直接與數組中元素進行比較。 public static int getMin2(int[] arr) { int min= arr[0]; for (int x=1;x<arr.length ;x++ ) { if(arr[x]<min) min=arr[x]; } return min; } |
排序-選擇排序
選擇排序
內循環結束一次,最值出現在零角標位置上。
public static void selectSort(int[] arr) { for (int x=0;x<arr.length-1;x++ )// { for (int y=x+1;y<arr.length ;y++ )//每次比都是與後面一位相比較。 { if(arr[x]>arr[y])//如果是從大到小,改爲<即可。
{ swap(arr,x,y); /* int temp =arr[x]; arr[x]=arr[y]; arr[y]=temp; */ } }
} } |
冒泡排序:相鄰的兩個元素進行比較,如果符合條件就換位。
第一圈:最值出現在末尾最後位。
public static void bubbleSort(int[] arr) { for (int x=0;x<arr.length-1;x++)//相鄰兩個元素比較,最後的時候就不能比較了。 { for (int y=0;y < arr.length-x-1;y++) { if (arr[y]>arr[y+1])//相鄰的兩個元素 { swap(arr,y,y+1); /* int temp = arr[y]; arr[y]=arr[y+1]; arr[y+1]=temp; */ } } } } 內循環:y < arr.length-x-1; -x:讓每一次比較的元素減少。 -1:避免角標越界。 參與內循環的元素在逐級的減少 |
折半查找
必須要保證該數組是有序的數組。獲得key所在位置。
public static int halfSearch(int[] arr,int key) { int min,max,mid; min = 0; max = arr.length-1; mid =(max+min)/2;//折半一次
while (arr[mid]!=key) { if(key>arr[mid]) min=mid+1; else if(key<arr[mid]) max = mid -1; if(min>max) return -1; mid =(max+min)/2;//比完之後,繼續折半。 } return mid; }
|
第二種方式: public static int halfSearch_2(int [] arr,int key) { int min=0,max=arr.length-1,mid; while(min<=max) { mid=(max+min)>>1; if (key>arr[mid]) { min =mid+1; } else if (key<arr[mid]) { max =mid -1; } else return mid; } return -1; |
十進制轉二進制
十進制-->二進制:就是除二模二的過程。重複去做。
public static void toBin(int num) { StringBuffer sb = new StringBuffer();//存儲容器,用於存儲“模值”; while (num>0) { sb.append(num%2);//容器有一個功能,添加數,算一個加一個在裏面存上。 //System.out.println(num%2); //模二 num=num/2;//除二 } System.out.println(sb.reverse()); |
十進制轉十六進制
十進制-->十六進制(四個二進制轉爲一個十六進制)
以前
int n1 = num &15;
n1-10+'a';//減去數字基數,加上字母基數,強轉獲得字母表達形式(char)(n1-10+‘A’)
int temp =num >>> 4;//無符號右移四位
temp&15;
public static void toHex(int num) { StringBuffer sb = new StringBuffer(); for (int x=0;x<8 ;x++ )//32位二進制數裏面最多8組4位二進制。 { int temp=num&15; if (temp>9) { sb.append((char)(temp-10+'A')); //System.out.println((char)(temp-10+'A'));//強制轉換爲char. } else //System.out.println(temp); sb.append(temp); num = num >>> 4; } System.out.println(sb.reverse());
} |
查表法獲得十六進制
查表法:將所有的元素臨時存儲起來,建立對應關係。
每一次&15後的值作爲索引去查建立好的表,就可以找到對應的元素。
這樣比-10+‘A’簡單的多。
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
==十六進制中的元素 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
13 |
15 |
|
public static void toHex(int num) { char[] chs ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; //定義一個臨時容器,數組。char類型 char [] arr=new char[8];// ‘\u0000’ int pos = 0;//定義一個指針來存 //for (int x=0;x<8 ;x++ )//固定8次,有多餘。 while(num!=0) { int temp = num & 15; //System.out.println (chs[temp]); arr[pos++] = chs[temp]; num = num>>>4;//無符號右移。 } //存儲數據的arr數組遍歷一下。 //for (int x= 0;x<arr.length ;x++ )//數組遍歷,結果仍然爲C3000000 //for (int x=arr.length-1;x>=0;x--) //反着打印。但是結果爲0000003C。有多餘的0。 for (int x=pos-1;x>=0;x--) { System.out.print(arr[x]+", "); } } |
二進制查表法
public static void toBin(int num) { char[] chs = {'0','1'}; char[] arr = new char[32]; int pos = arr.length; while (num!=0) { int temp = num & 1; arr[--pos] = chs[temp]; num = num>>>1; } for (int x=pos;x<arr.length ;x++ ) { System.out.print(arr[x]); } } |
進制轉換優化程序(包括二進制,八進制,十六進制)
class ArrayTest7 { public static void main(String[] args) { System.out.println("6的二進制爲:"); toBin(6); System.out.println("60的十六進制爲:"); toHex(60); System.out.println("60的二進制爲:"); toBa(60); } /* 十進制-->二進制 */ public static void toBin(int num) { trans(num,1,1); } /* 十進制-->八進制 */ public static void toBa(int num) { trans(num,7,3); } /* 十進制-->十六進制 */ public static void toHex(int num) { trans(num,15,4); } public static void trans(int num,int base, int offset) { if(num==0) { System.out.println(0); return; } char[] chs ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; char[] arr = new char[32]; int pos =arr.length; while(num!=0) { int temp = num & base; arr[--pos] = chs[temp]; num = num >>>offset; } for (int x=pos;x<arr.length ;x++) { System.out.print(arr[x]); } System.out.println(); } } |
---------------------- android培訓、java培訓、期待與您交流! ----------------------
詳細請查看:http://edu.csdn.net/heima