黑马程序员_第4天

(一)   数组

静态初始化:

int[] arr = new int[2];//建议格式

int arr[] = new int[2];//也可以

 

int[] arr = new int[]{3,1,6,5,4};

int[] arr = {3,1,6,5,4};

 

int[] arr = new int[5];

arr[0] = 90;

arr[1] = 80;

boolean型数组默认值为false.

数组操作常见问题:

  ArrayIndexOutOfBoundsException: 操作数组时,访问到了数组中不存在的角标。

  NullPointerException:空指针异常。当引用没有任何指向值为null的情况,该引用还在用于操作实体。

数组常见操作-遍历

获取数组中的元素。通常会用的遍历。

数组中有一个属性可以直接获取到数组元素个数。length.

使用方式:数组名称.length

 

(二)   排序-选择排序、冒泡排序

选择排序特点:

内循环结束一次,最值出现在头角标位置上。

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);
      }

    }
  }

冒泡排序:相邻的两个元素进行比较,如果符号条件换位。

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

 

Java中已经定义好的一种排序方式。开发中,对数组排序。要使用该句代码:

Arrays.sort(arr);

 

(三)数组的查找操作

 //定义功能,获取key第一次出现在数组中的位置。如果返回是-1,那么代表该key在数组中不存在。
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 int getIndex_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 min;
}

 

(四)   十进制转二进制

//十进制-->二进制
public static void toBin(int num)
{
    StringBuffer sb = new StringBuffer();
    while(num>0)
    {
        //System.out.println(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)
                {
                         //System.out.println((char)(temp-10 +'A'));
                         sb.append((char)(temp-10 +'A'));
                }
                else
                {
                         //System.out.println(temp);
                         sb.append(temp);
                }
                num = num >>> 4;
       }
       System.out.println(sb.reverse());
}

  

(六)十进制转十六进制(查表法)

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'简单的多。

这个表怎么建立呢?

可以通过数组的形式来定义。  

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]+",");
    }
}

 

(七)十进制转二进制(查表法)

public static void toBin_2(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) 
    {
        //toBin(-6);
        //toHex(-60);
        //toBa(60);

        //System.out.println(Integer.toBinaryString(6));
        //System.out.println(Integer.toHexString(6));
    }

    /*
    十进制转二进制
    */
    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]);
        }

        return ;
    }
}

 

(九)二维数组

数组中的数组

二维数组[][]

格式1:

int[][] arr = new int[3][2];

定义了名称为arr的二维数组

二维数组中有3个一维数组

每一个一维数组中有2个元素

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

给第一个一维数组1角标位赋值78写法是:arr[0][1] = 78;

格式2:

int[][] arr = new int[3][];

二维数组中有3个一维数组

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

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

arr[0] = new int[3];

arr[1] = new int[1];

arr[2] = new int[2];

 

二维数组练习

定义一维数组:

int[] x; int x[];

定义二维数组:

int[][] y; int y[][]; int[] y[];
int[] x,y[];//x一维,y二维。

int[] x;

int[] y[];


a.
x[0] = y;//error

 

b.
y[0] = x;//yes

 

c.
y[0][0] = x;//error

 

d.
x[0][0] = y;//error

 

e.
y[0][0] = x[0];//yes

 

f.
x=y;//error

 

 

posted on 2013-04-27 22:17  SinceDayOne  阅读(150)  评论(0编辑  收藏  举报

导航