黑马程序员-Java基础知识-day04

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


数组的常见操作

1.遍历

class ArrayDemo
{
      public static void main(String[] args)
      {
             //数组的操作:获取数组中的元素,通常会用到遍历
             //int[]arr = new int[3];
             int[]arr = {3,6,4,1,9,6,0};
             //数组中有一个属性可以直接获取到数组元素个数:length。
             //使用方式:数组名称.length
             /*
             for(int x=0; x<arr.length; x++)
             {
                    System.out.println("arr["+x+"]="+arr[x]+";");
             }
             */
             printArray(arr);
      }

//定义一个打印数组的方法(函数)

public static void printArray(int[] arr)
      {
             System.out.print("[");//为了输出的结果好看,这里直接输出一个正括号
             for(int x=0; x<arr.length; x++)
             {
                    if(x!=arr.length-1)//只要x不等于数组的最后一个元素,就输出一个数组元素和一个逗号
                           System.out.print(arr[x]+",");
                    else
                           System.out.println(arr[x]+"]");
             }
      }
}

小结:length:可以直接获取数组元素的个数或者长度。


2、获取最值

给定一个数组{5,1,6,4,2,8,9}

1.获取数组中的最大值,以及最小值。

获取数组中的最大值。

思路:

1.获取最值需要进行比较,每一次比较都会有一个较大的值,因为该值不确定,通过一个变量进行临存。

2.让数组中的每一个元素都和这个变量中的值进行比较,如果大于了变量中的值,就用该变量记录较大值。

3.当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值了。

步骤:

1.定义变量,初始化为数组中任意一个元素即可。

2.通过循环语句对数组进行遍历。

3.在变量过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给该变量;

需要定义一个功能来完成,以便提高函数复用性。

1.明确结果,数组中的最大值

2.未知内容,一个数组,int[]

*/

class ArrayTest
{
      public static int getMax(int[] arr)
      {
             int max = arr[0];
             for(int x=1; x<arr.length; x++)//之所以将x定义为1,是为了少比较一次
             {
                    if(arr[x]>max)
                           max= arr[x];
             }
             return max;
      }
 
      //获取最值的另一种方法
      //可不可以将临时变量初始化为0呢?可以,这种方式,其实是在初始化为数组中任意一个角标。
      public static int getMax_2(int[] arr)//将需要操作的数组传递进来int[]arr
      {
             intmax = 0;
             for(int x=1; x<arr.length; x++)
             {
                    if(arr[x]>arr[max])
                           max= x;
             }
             return arr[max];
      }
      public static void main(String[] args)
      {
             int[]arr = {5,1,6,4,2,8,9};
             int max = getMax(arr);
             System.out.println("max="+max);
      }
}

小结:程序中定义的max,其实是可以定义两种方法的,第一种就是直接赋值为数组中的一个元素,即arr[0],这样返回值就直接得到的是一个元素;第二种方法就是可以将其定义为数组元素中的一个角标,也就是arr[max],这样获取的值在经过arr数组封装后也能得到相应结果。通俗的说就是可以将max定义为数组中的元素或者角标。

 

3、常见排序方法

3.1选择排序法

对给定数组进行排序:{5,1,6,4,2,8,9}

class ArrayTest2
{
      //定义一个排序方法:选择排序法
      //选择排序:内循环结束一次,最值出现在头角标的位置上。
      public static void selectSort(int[] arr)
      {
//由于不需要比较到最后一个元素,因此这里可以将其长度-1,减少一次比较,提高效率
             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;
                           }
                    }
             }
      }
 
      //冒泡排序
      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++)//-x:让每一次比较的元素逐渐减少,-1:避免角标越界
                    {
                           if(arr[y]>arr[y+1])
                           {
                                  /*
                                  int 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);
 
//Arrays.sort(arr);//java中已经定义好了一种排序方法,开发时就用这种排序方法
      }
 
      //定义一个遍历数组的方法
      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]+"]");
             }
      }
}
小结:

选择排序:头元素与后面的元素一一比较,也就是内循环结束一次,最值出现在头角标位置上;接着头元素自增,循环与后面的元素进行比较,即可得到排序结果。大圈套小圈,尖朝下,改变内循环初始值

冒泡排序:相邻的两个元素进行比较,如果符合条件就换位。大圈套小圈,尖朝上,改变内循环条件


4、数组的查找操作:折半查找

练习:有一个有序的数组,想要将一个元素插入到该数组中,还要保证该数组是有序的,如何获取该元素在数组中的位置?

class ArrayTest4
{
      //定义功能,获取key第一次出现在数组中的位置,如果返回是-1,那么代表该key在数组中不存在。
      public static int getIndex(int[] arr,int key)
      {    
             int min=0;//定义需要插入未知的初始化角标
             for(int x=0; x<arr.length; x++)
             {
                    if(arr[x]==key)
                           return x;
             }
             return-1;//由于数组中不存在-1这个角标,因此返回-1则说明该数组中没有这个元素,即表示错误
      }
 
      //折半查找:提高效率,但是必须要保证数组是有序的数组
      public static int halfSearch(int[] arr,int key)
      {
             int min,max,mid;
             min= 0;
             max= arr.length-1;
             mid= (min+max)/2;
             while(arr[mid]!=key)
             {
                    if(key>arr[mid])
                           min= mid+1;
                    elseif(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= (min+max)/2;
                    if(key>arr[mid])
                           min= mid+1;
                    elseif(key<arr[mid])
                           max= mid-1;
                    else
                           return mid;
             }
             return -1;
      }
      public static void main(String[] args)
      {
             int[]arr = {3,5,6,7,8,9};
             //int index = getIndex(arr,0);
             int index = halfSearch_2(arr,6);
             System.out.println("index="+index);
      }
}

面试题:有一个有序的数组,想要将一个元素插入到该数组中,还要保证该数组是有序的,如何获取该元素在数组中的位置?

解答:可以通过折半查找的方法,确定需要插入的数的角标,继而将原本返回为-1的那句改成min即可

public static int halfSearch_2(int[]arr,int key)
      {
             int min=0,max = arr.length-1,mid;
             while(min<=max)
             {
                    mid= (min+max)/2;
                    if(key>arr[mid])
                           min= mid+1;
                    elseif(key<arr[mid])
                           max= mid-1;
                    else
                           return mid;
             }
             return min;//返回的这个min就是需要插入的数的角标
      }
小结:

需要值得注意几点的是,在折半查找的方法中,首先就是需要确定要折半的数组是有序的,其次,在定义好一个标记key后,与折半的最大、小值相比较,继而突出折半的原理,而在查找的过程中,还需将中间值角标mid=(min+max)/2一次,防止出现死循环。


5、进制转换

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)
{
sb.append(num%2);//将num%2的值添加到容器中
num = num/2;
}
System.out.println(sb.reverse);//将得到的数据反转
}
      //十进制-->十六进制
      publicstatic void toHex(int num)
      {
//定义一个容器,用于存储数据
             StringBuffer sb = new StringBuffer();
 
             for(int x=0; x<8; x++)//由于取的是最低4位,而在十六进制中有4组八位,因此这里的x<8
             {
                    inttemp = num & 15;//之所以num&15,是为了得到其最低4位
                    if(temp>9)
                           //System.out.println((char)(temp-10+'A'));
                           sb.append((char)(temp-10+'A'));
                    else
                           //System.out.println(temp);
                           sb.append(temp);
                    num= num >>> 4;//无符号往右移4位
             }
             System.out.println(sb.reverse());
      }
}

//查表法 

class ArrayTest6
{
      public static void main(String[] args)
      {
             toHex(60);
      }
      /*
             01 2 3 4 5 6 7 8 9 A  B  C D  E  F           -->十六进制中的元素
             01 2 3 4 5 6 7 8 9 10 11 12 13 14 15
 
             查表法:将所有的元素临时存储起来,建立对应关系。
             每一次&15后的值作为索引去查建立好的表,就可以找对应的元素。
             这样比-10+‘A’简单得多
 
             这个表该怎么建立呢?可以通过数据的形式来定义。
      */
 
      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;
             //for(intx=0; x<8; x++)
             while(num!=0)
             {
                    int temp = num & 15;
                    //System.out.println(chs[temp]);
                    arr[--pos]= chs[temp];
                    num= num >>> 4;
             }
 
             //存储数据的arr数组遍历
             for(int x=pos; x<arr.length; x++)
             {
                    System.out.print(arr[x]+",");
             }
      }
}
//查表法

class ArrayTest6
{
      public static void main(String[] args)
      {
             //toHex(60);
             toBin(6);
      }
 
      /*
      十进制-->二进制
      */
      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]);
             }
      }
 
 
      /*
      十进制-->十六进制
             01 2 3 4 5 6 7 8 9 A  B  C D  E  F           -->十六进制中的元素
             01 2 3 4 5 6 7 8 9 10 11 12 13 14 15
 
             查表法:将所有的元素临时存储起来,建立对应关系。
             每一次&15后的值作为索引去查建立好的表,就可以找对应的元素。
             这样比-10+‘A’简单得多
 
             这个表该怎么建立呢?可以通过数据的形式来定义。
      */
 
      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;
             //for(int x=0; x<8; x++)
             while(num!=0)
             {
                    int temp = num & 15;
                    //System.out.println(chs[temp]);
                    arr[--pos]= chs[temp];
                    num= num >>> 4;
             }
 
             //存储数据的arr数组遍历
             for(int x=pos; x<arr.length; x++)
             {
                    System.out.print(arr[x]+",");
             }
      }
}

class ArrayTest7
{
      public static void main(String[] args)
      {
             //toBin(6);
             //toBa(60);
             toHex(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];
 
             intpos = arr.length;
 
             while(num!=0)
             {
                    int temp = num & base;
                    arr[--pos]= chs[temp];
                    num= num >>> offset;
             }
//直接将pos的值赋值给x
             for(int x = pos; x<arr.length; x++)
             {
                    System.out.print(arr[x]);
             }
      }
}
小结:在进制互转的过程中,指针很重要,为了让得到的数据时正着打印,这里可以定义一个pos指针,使其初始化值就为数组arr.length,继而让pos自减,即可得到一个正着打印的数组。

 

6、二维数组[][]

格式1:int[][] arr = new int[3][2];

解析:

(1)定义了名为arr的二维数组;

(2)二维数组中有3个一维数组

(3)每个一维数组中有2个元素

(4)一维数组的名称分别为arr[0],arr[1],arr[2]

 

格式2:int[][] arr = new int[3][];

(1)二维数组中有3个一维数组

(2)每个一维数组都是默认初始化值null

(3)可以对这个三个一维数组分别进行初始化

arr[0] = new int[3];

arr[1] = new int[1];

arr[2] = new int[2];

格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};

(1)定义一个名称为arr的二维数组

(2)二维数组中有三个一维数组

(3)每一个一维数组中具体元素也都已初始化

arr[0] = {3,8,2};

arr[1] = {2,7};

arr[2] = {9,0,1,6};

(4)第三个一维数组的长度表示方式:arr[2].length;

class Array2Demo
{
      public static void main(String[] args)
      {
             /*
             int[]arr = new int[3];//一维数组
 
             int[][]arr = new int[3][4];//定义了名称为arr的二维数组,二维数组中有
                                                //3个一维数组,每一个一维数组中有四个元素。
 
 
             int[]][]arr = new int[3][];
             arr[0]= new int[3];
             arr[1]= new int[1];
             arr[2]= new int[2];
 
             System.out.println(arr.length);//打印是二维数组的长度:3
             System.out.println(arr[0].length);//打印二维数组中第一个一维数组长度
             */
 
             int[][]arr = {{1,4,5,6},{2,5,6,3},{77,8,5,4}};
             int sum = 0;
             for(int x=0;x<arr.length; x++)
             {
                    for(int y=0;y<arr[x].length; y++)
                    {
                           sum= sum+arr[x][y];
                    }
             }
             System.out.println("sum="+sum);
      }
}

一维、二维数组的常见写法:

一维数组:int[] x;          intx[];

二维数组:int[][] y; int y[][]; int[]y[];


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值