学习内容:1.数组初始化常态-常见问题、2.数组(常见操作-遍历)、3.数组(常见操作-获取最值)、4.数组(排序-选择排序、冒泡排序、功能抽取)、5.数组(折半查找)、6.(二进制-十进制-十六进制)、7.(查表法-十进制-十六进制)、8.(进制转换优化)
1.数组的常见问题。
class ArrayDemo2
{
public static void main(String[] args)
{
// int[] arr = new int[2];
// int arr[] = new itn[2]; //通常用上面的表达比较正式。
int[] arr = {3,1,6,5,4};
System.out.println(arr[3]);//打印结果是5,角标:01234:0-3,1-1,2-6,3-5,4-4。
int[] arr1 = new int[5];
System.out.println(arr1[4]);
//ArrayIndexOutOfBoundsException:arr[5]不存在的角标。
int[] arr2 = new int[3];
arr2 = null;
System.out.println(arr2[1]);
//ArrayIndexOutOfBoundsException:空指针异常。
}
}
-----------------------------------------------------------------------------------------------------
2.数组(常见操作-遍历)
class ArrayDemo3
{
public static void main(String[] args)
{
int [] arr = {1,2,3,4,5,6,7};
for(int x=0;x<7;x++)
{
System.out.println("arr["+x+"]是"+arr[x]);
}
System.out.println("length:"+arr.length);//length获取数组的长度。
int sum = 0;
for(int x=0;x<arr.length;x++)
{
sum += arr[x];
}
System.out.println("arr里面的数的总和是"+sum);
printArray(arr);
printArray(arr);
}
public static void printArray(int[] arr)
{
for(int x=0;x<arr.length;x++)
{
if(x != arr.length-1)// != 不等于,如果x不等于6(lenght(7-1))的话。== 是相当于;= 是赋值。
System.out.print(arr[x]+",");
else
System.out.print(arr[x]);
}
System.out.println();
}
}
-----------------------------------------------------------------------------------------------------
3.数组(常见操作-获取最值)/*
数组{5,1,6,4,2,8,9}。
1.获取数组中的最大值及最少值。
*/
class ArrayTest
{
public static int getMax(int[] arr)
{
int max = arr[0]; //定义一个临时的变量;
for(int x=1;x<arr.length;x++) //使用for循环语句遍历数组里的元素;
{
if(arr[x] > max) //使用if语句比较元素和max临时变量;
max = arr[x];//如果元素大于临时变量,则赋值给变量。直到比较出最大值;
}
return max;//??为什么返回给max???
}
/*
Java中return用于方法,两个作用:
(1)返回方法指定类型的值(这个值总是确定的),也可以是对象
(2)方法的结束
*/
public static int getMax2(int[] arr)
{
int max = 0;
for(int x=1;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 void main(String[] args)
{
int[] arr = {11,5,1,6,4,2,8,9,10,-1,0};
int max = getMax(arr);
System.out.println("数组的最大数是"+max);
int max2 = getMax2(arr);
System.out.println("数组的最大数是"+max2);
int min = getMin(arr);
System.out.println("数组的最小数是"+min);
}
}
-----------------------------------------------------------------------------------------------------
4.数组(排序-选择排序、冒泡排序、功能抽取)
{
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])
{
/* int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp; */
swap(arr,x,y);
/*
[5] [1]
arr[x] → 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])
{
/* i nt temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp; */
swap(arr,y,y+1);
}
}
}
}
public static void swap(int[]arr,int a,int b) //抽取封装,定义成函数。
{
int temp = arr[a];
arr[a] = arr [b];
arr[b] = temp;
}
public static void main(String[] args)
{
int[] arr ={5,1,6,4,2,8,9};
printArray(arr);
//SelectSort(arr);
BubbleSort(arr);
printArray(arr);
}
public static void printArray(int[] arr)
{
for(int x=0;x<arr.length;x++)
{
if(x != arr.length-1)
System.out.print(arr[x]+",");
else
System.out.print(arr[x]);
}
System.out.println();
}
}
//Java的Arrays.sort();是Java中已经定义好的排序方式。开发程序,使用这种代码对数组进行排序。
-----------------------------------------------------------------------------------------------------
5.数组(折半查找)
class ArrayTest4
{
public static void main(String[] args)
{
int[] arr = {1,2,3,4,5,6,7,8,9,10,11,12};
printArray(arr);
int Index = getIndex(arr,10);
System.out.println("Index="+Index);
int half = halfSearch(arr,7);
System.out.println("Index="+half);
int half2 = halfSearch2(arr,12);
System.out.println("index="+half2);
int half3 = DingYi(arr,13);
System.out.println("index="+half3);
printArray(arr);
}
//折半查找,高效率,但必须保证是有序的数组。
public static int halfSearch(int[] arr,int key)
{
int min = 0;
int max = arr.length-1;
int mid = (min+max)/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 = (min+max)/2;
}
return mid;
}
//折半查找第二种方式:
public static int halfSearch2(int[] arr,int key)
{
int min=0,max=arr.length-1,mid;
while(min<=max) //不小心写了while(min<=max),但运行结果正确!why?
{
mid=(min+max)>>1; //向右移动一位,相当于除以2(2 2 2 2 2 2 2 2)。
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return -1;
}
public static int DingYi(int[] arr,int key)
{
int min=0,max=arr.length-1,mid;
while(min<=max)
{
mid =(min+max)>>1;
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return min;
}
//定义功能,查找key在数组中第一次出现的位置。出现-1,则不存在。
public static int getIndex(int[] arr,int key)
{
for(int x=0;x<arr.length;x++)
{
if(arr[x] == key)
return x;
}
return -1;
}
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.print(arr[x]+"]");
}
System.out.println();
}
}
-----------------------------------------------------------------------------------------------------
6.(二进制-十进制-十六进制)
class ArrayTest5
{
public static void main(String[] args)
{
toBin(6);
toHex(60);
}
//十进制-》二进制;
public static void toBin(int num)
{
StringBuffer sb = new StringBuffer();
while(num>0)
{
//System.out.print(num%2);
sb.append(num%2);
num = num / 2;
}
System.out.println(sb.reverse());
}
//十进制-》十六进制;
public static void toHex(int num)
{
StringBuffer sb = new StringBuffer();
for(int x=0;x<8;x++)
{
int temp = num & 15;
if(temp > 9)
sb.append((char)(temp-10+'A'));
//System.out.println((char)(temp-10+'A'));
else
sb.append(temp);
//System.out.println(temp);
num = num >>>4;
}
System.out.println(sb.reverse());
}
}
-----------------------------------------------------------------------------------------------------
7.(查表法-十进制-十六进制)
/*
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 14 15
查表法:将所有的元素临时存储起来。建立对应关系。
每一次 & 15后的值作为索引去查建立好的表。就可以找对应的元素。这样比-10+'A'简单得多。
*/
class ArrayTest6
{
public static void main(String[] args)
{
toHex(60);
}
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[] arr = new char[8];
int pos = arr.length;
while(num != 0)
{
int temp = num & 15;
//System.out.println(chs[temp]);
arr[--pos] = chs[temp];
num = num >>> 4;
}
System.out.println("pos="+pos);
//存储数据的arr数组遍历。
for(int x=pos;x<arr.length;x++)
{
System.out.print(arr[x]+",");
}
}
}
-----------------------------------------------------------------------------------------------------
8.(进制转换优化)
class ArrayTest7
{
public static void main(String[] args)
{
toBin(6);
System.out.println();
toBa(60);
System.out.println();
toHex(0);
}
//十进制-->二进制
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)//如果数值是0,直接打印,return停止运算。
{
System.out.print(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;//二进制:base是1;八进制:base是7;十六进制:base是15。
arr[--pos] = chs[temp];//
num = num >>> offset;
}
for(int x=pos;x<arr.length;x++)
System.out.print(arr[x]);
}
}
-----------------------------------------------------------------------------------------------------
9.(二维数组)
class Array2Demo
{
public static void main(String[] args)
{
int[][] arr = {{6,5,3,2},{2,4,5,2},{2,4,5,6}};
int sum = 0;
//System.out.println(arr[0][1]);
for(int x=0;x<arr.length;x++)
{
for(int y=0;y<arr[x].length;y++)//arr[x]长度是4。
{
sum = sum + arr[x][y];//[0][0]、[0][1]、[0][2]、[0][3]
}
}
System.out.println("sum="+sum);
}
}