黑馬程序員-Java語言基礎 第4天

---------------------- 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章