黑马程序员_java基础day04

来源:互联网 发布:pdfobject.js使用方法 编辑:程序博客网 时间:2024/04/30 20:39

------- android培训、java培训、期待与您交流! ----------

主要内容:一数组、二 数组排序(选择、冒泡)、三数组查找(折半)、四 进制转换、五 二维数组

一、数组的定义
    概念:同一种类型数据的集合。其实数组就是一个容器。
    数组的好处:
可以自动给数组中的元素从0开始编号,方便操作这些元素。
    格式1:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例:int[] arr = new int[5];
    格式2:
元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
    数组的两个常见异常:
ArrayIndexOutOfBoundsException: 3:操作数组时,访问到了数组中不存在的角标。
NullPointerException:空指针异常:当引用没有任何指向值为null的情况,
该引用还在用于操作实体。
打印数组中的元素,通常会用到遍历。

class ArrayDemo{public static void main(String[] args){int[] arr = {4,3,2,6,5,7,8}printArray(arr);}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]+", ");elseSystem.out.println(arr[x]+"]"0);}}}
获取数组中的最值
class ArrayTest {public static void getMax(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 void main(String[] args) {int[] arr = {4,4,7,8,9,3,5};int max = getMax(arr);System.out.println("max="+max);}}

二、对给定数组排序。
1,选择排序。
选择排序每次都是找一个固定的元素和其他元素相比,
第一圈结束后,最值出现在头角标位置上。

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

2,冒泡排序。
思路:冒泡排序每轮排序都是相邻元素之间进行比较,第一圈结束后最值出现在了最后位置上。
每轮排序结束后,下一轮比较都会减少一个元素。代码如下:

public static void bulbbleSort(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;}}}}
3,真实开发中用到的排序,java已经提供好了

import java.util.*;{Arrays.sort(arr);}
三、数组的查找操作。
1,顺序查找。

public static void main(String[] args){int[] arr = {4,7,6,8,9,3,5};int index = getIndex(arr,3);System.out.println("index="+index);}//定义功能,获取key第一次出现在数组中的位置。如果返回-1,代表该key在数组中不存在。public static void getIndex(int[] arr,int key){for(x=0;x<arr.length;x++){if(arr[x]==key)return x;}return -1;}

2,折半查找。可以提高效率,但是必须保证数组是有序的。

public static void main(String[] args){int[] arr = {4,5,6,8,9,11,13};int index = halfSearch(arr,11);System.out.println("index="+index);}public static void halfSearch(int[] arr,int key){int min=0,max=arr.length-1,mid;while (min<max){mid = (max+min)>>1;//相当于除以2if(key>arr[mid]min = mid+1;else if(key<arr[mid])max = mid-1;elsereturn min;}return -1;}

四、用数组实现十进制转二进制、八进制、十六进制示例
十进制转换其他进制,需要明确3个数据。num被转换的十进制数,base是&上的基数。
offset右移的位数。

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;//base是转换的基数arr[--pos] = chs[temp];num = num >>>offset;//offset右移位数}for(int x=pos;x<arr.length;x++)//从有效位遍历{System.out.print(arr[x]);}}十进制-->二进制public static void toBin(int num){trans(num,1,1);//二进制,&上1,每次右移1位}十进制-->八进制public static void toBa(int num){trans(num,7,3);//八进制,&上7,每次右移3位}十进制-->十六进制public static void toHex(int num){trans(num,15,4);//十六进制,&上15,每次右移4位}
五、二维数组[][]
    格式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];