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