黑马程序员-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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值