黑马程序员技术交流社区
标题: 数组、数组工具类、文档注释总结 [打印本页]
作者: 李培根 时间: 2012-12-8 15:48
标题: 数组、数组工具类、文档注释总结
数组两种定义格式:
第一种定义格式:(需要一个容器,但是不明确容器的具体数据) // 元素类型 [] 数组名 = new 元素类型[元素个数或数组长度];
int[] arr = new int[3];
arr[0]= 8;
System.out.println(arr[0]);
第二种定义格式:(需要一个容器,存储已知的具体数据)
元素类型 [] 数组名 = new 元素类型[]{元素,元素……};
int[] arr = new int [] {1,34,56};
int[] arr ={1,34,56};
数据一多就要用数组存。
数组:常见问题
int[] arr = new int[3];
System.out.println(arr[3]);//ArrayIndexOutOfBoundsException
当访问到数组中不存在的角标时,就会发生数组角标越界异常
arr = null;
System.out.println(arr[0]);//NullPointException
当引用型变量没有任何实体指向时,还在用其操作实体就会引发该异常。
数组常见操作:1、遍历。
//对数组最基本的操作就是存和取,核心思想就是对角标的操作。
int[] arr = new int []{1,34,56,78};
System.out.println("length:"+arr.length);
for (int i = 0; i < arr.length; i++) {
System.out.println("arr["+i+"]="+arr+";");
}
for (int i = 0; i < arr.length; i+=2) {//取偶数角标
System.out.println("arr["+i+"]="+arr+";");
}*/
数组常见操作:2、获取最值
/*思路:
1、需要进行比较,并定义变量记录每次比较后较大的值。
2、遍历数组,和比昂两中记录的元素进行比较。
3、遍历结束,该变量记录的就是最大值。
定义一个功能来实现。*/
int[] arr = new int []{1,34,56,78,3};
System.out.println(getMax2(arr));
}
public static int getMax(int[] arr) {
int maxElement = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr>maxElement)
maxElement = arr;
}
return maxElement;
}
public static int getMax2(int[] arr) {
int maxIndex = 0;
for (int i = 1; i < arr.length; i++) {
if(arr>arr[maxIndex])
arr[maxIndex] = arr;
}
return arr[maxIndex];
}
数组常见操作:3、排序
3.1选择排序
public static void selectSort(int[] arr){
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[j]<arr){
int temp = arr;
arr = arr[j];
arr[j] = temp;
}
}
}
}
3.2冒泡排序
private static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {//-1避免角标越界 -i为了外循环增加一次内循环参与比较的元素个数递减
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
排序性能小练习
public class ArrayDemoXingNeng {
// 排序性能练习
// 使用变量记住最小的元素和角标,遍历一遍后进行一次换位
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = new int [] {1,2,59,68,38,74};
for (int i = 0; i < arr.length-1; i++) {
int num = arr;
int index = i;
for (int j = i+1; j < arr.length; j++) {
if(num>arr[j]){
num = arr[j];
index = j;
}
}
if(index!=i){
swap(arr,i,index);
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr+",");
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr;
arr = arr[j];
arr[j] = temp;
}
}
数组常见操作:4、查找
如果查找的元素在数组中存在多个,会返回第一个的index
//普通查找
public static int getIndex(int[] arr, int key){
for (int i = 0; i < arr.length; i++) {
if(key==arr)
return i;
}
return -1;
}
//折半查找(二分查找)必须是有序的数组
public static int binarySearch(int[] arr,int key){
int max,min,mid;
min = 0;
max = arr.length-1;
mid = (min+max)/2;
while(arr[mid]!=key){
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
if(max<min)
return -1;
mid = (min+max)/2;
}
return mid;
}
//二分查找_2
public static int binarySearch_2 (int[] arr,int key){
int max,min,mid;
min = 0;
max = arr.length-1;
while(max>=min){
mid = (min+max)>>1;
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return -1;
}
数组的使用
什么时候使用数组?
如果数据出现了对应关系,而且对应关系的一方是有序的数字编号,并作为角标使用。
这时就必须要想到数组的使用。
就可以将这些数据存储到数组中。
根据运算的结果作为角标直接去查数组中对应的元素即可。
这种方式称为查表法。
作者: 李培根 时间: 2012-12-8 15:48
使用查表法小练习.
输出对应星期
getWeek(5);
public static String getWeek(int num){
//定义一个对应关系表
if(num>7 || num<1)
return "没有对应的星期";
String[] str = {"","星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
return str[num];
}
进制转换
toHex(60);
public static void toHex(int num){
if(num==0){
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[8];
int pos = arr.length;
while(num!=0){
int temp = num & 15;
arr[--pos] = chs[temp];//temp作为角标 查表 chs 对应的是字符
num = num>>>4;//>>>无符号右移。
}
for (int i = pos; i < arr.length; i++) {
System.out.print(arr[i]);
}
进制转换
//十进制--->十六进制
public static void toHex(int num){ trans(num,15,4);
}
//十进制--->八进制
public static void toOctal(int num){
trans(num,7,3);
}
//十进制--->二进制
public static void toBinary(int num){
trans(num,1,1);
}
public static void trans(int num,int base,int offset){
if(num==0){
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[8];
int pos = arr.length;
while(num!=0){
int temp = num & base;
arr[--pos] = chs[temp];//temp作为角标 查表 chs 对应的是字符
num = num>>>offset;//>>>无符号右移。
}
for (int i = pos; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
二维数组
格式一
int[][] arr = new int[3][2];
定义了名称为arr的二维数组。
二维数组中有三个一维数组。
每个一维数组中有两个元素。
一维数组的名称分别为arr[0],arr[1],arr[2]。
给第一个一维数组角标1角标位赋值为7的写法是:arr[0][1] = 7;
格式二
int[][] arr = new int[3][];
二维数组中有三个一维数组。
每个一维数组的默认初始化值是null。
可以对这三个一维数组分别进行初始化
arr[0] = new int[3];
arr[1] = new int[1];
arr[2] = new int[2];
格式三
Int[][] arr = {{1,5,8},{6,6,36,58},{74};
int[][] arr = new int[3][2];
System.out.println(arr[0].length);
System.out.println(arr);//直接打印二维数组
System.out.println(arr[0]);//直接打印二位数组中角标为0的,一维数组
System.out.println(arr[0][1]);//直接打印二位数组中角标为0的,一维数组中角标为1的元素
遍历二维数组
int[][] arr = {{15,56,78,95},{85,48,235},{49,69}};
for (int i = 0; i < arr.length; i++) {
System.out.print('[');
for (int j = 0; j < arr[i].length; j++) {
if(j!=arr[i].length-1){
System.out.print(arr[i][j]+",");
}else{
System.out.println(arr[i][j]+"]");
}
}
}
数组工具类和文档注释总结
public class ArrayToolDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//数组工具对象的建立
int[] arr = {4,3,6,8,9,5,30};
/*int maxIndex = 0;
for (int i = 1; i < arr.length; i++) {
if(arr[i]>arr[maxIndex])
maxIndex = i;
}*/
//ArrayTool tool = new ArrayTool();对象的建立无意义,浪费内存空间
int max = ArrayTool.getMax(arr);//int max = tool.getMax(arr);
System.out.println("max="+max);
int index = ArrayTool.getIndex(arr,4);//int index = tool.getIndex(arr,4);
System.out.println("index=" + index);
}
}
/**
建立一个 用于操作数组的工具类,其中包含着常见的对数组操作的函数,如:排序,获取最值,查找等
* @author peigen
* @version v1.0
*
*/
public class ArrayTool{//一个类文档化的前提是:必须是public权限。
//加上public后文件名和类名要一致,否则会编译失败。
private ArrayTool(){}//强制其不允许创建对象。
//该类的方法都是静态的,所以该类是不需要创建对象的 ,
//为了保证不让其他程序创建该类对象,可以将该类的构造函数私有化。
/**
获取整型数组的最大值。
@param arr 接收一个元素为int类型的数组。
@return 返回该数组中最大的元素。
*/
public static int getMax(int[] arr){//没有访问对象中的特有数据,所以静态化
int maxIndex = 0;
for (int i = 0; i < arr.length; i++) {
if(arr[i]>arr[maxIndex])
maxIndex = i;
}
return arr[maxIndex];
}
/**
* 对数组进行选择排序
* @param arr 接收一个元素为int类型的数组。
*/
public static void selectSort(int[] arr){
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[i]>arr[j]) {
swap(arr, i, j);
}
}
}
}
/**
用于给数组进行元素的位置置换。
@param arr 接收一个元素为int类型的数组。
@param i
@param j
*/
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/**
* 获取指定元素在指定数组中的索引。
* @param arr接收一个元素为int类型的数组。
* @param key 要找的元素
* @return 返回该元素第一次出现的位置,如果不存在返回-1
*/
public static int getIndex(int[] arr,int key){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == key)
return i;
}
return -1;
}
/**
* 将int数组装潢成字符串。格式是[e1,e2……]
* @param arr 接收一个元素为int类型的数组
* @return 返回该数组的字符串表现形式。
*/
public static String arrayToString(int[] arr){
String str = "[";
for (int i = 0; i < arr.length; i++) {
if(i !=arr.length-1)
str = str + arr[i]+ ", "
else
str = str + arr[i]+ "]"
}
return str;
}
}
作者: 李培根 时间: 2012-12-8 15:49
本帖最后由 李培根 于 2012-12-8 15:51 编辑
进制转换
toHex(60);
public static void toHex(int num){
if(num==0){
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[8];
int pos = arr.length;
while(num!=0){
int temp = num & 15;
arr[--pos] = chs[temp];//temp作为角标 查表 chs 对应的是字符
num = num>>>4;//>>>无符号右移。
}
for (int i = pos; i < arr.length; i++) {
System.out.print(arr);
}
进制转换
//十进制--->十六进制
public static void toHex(int num){ trans(num,15,4);
}
//十进制--->八进制
public static void toOctal(int num){
trans(num,7,3);
}
//十进制--->二进制
public static void toBinary(int num){
trans(num,1,1);
}
public static void trans(int num,int base,int offset){
if(num==0){
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[8];
int pos = arr.length;
while(num!=0){
int temp = num & base;
arr[--pos] = chs[temp];//temp作为角标 查表 chs 对应的是字符
num = num>>>offset;//>>>无符号右移。
}
for (int i = pos; i < arr.length; i++) {
System.out.print(arr);
}
}
二维数组
格式一 int[][] arr = new int[3][2];
定义了名称为arr的二维数组。
二维数组中有三个一维数组。
每个一维数组中有两个元素。
一维数组的名称分别为arr[0],arr[1],arr[2]。
给第一个一维数组角标1角标位赋值为7的写法是:arr[0][1] = 7;
格式二 int[][] arr = new int[3][];
二维数组中有三个一维数组。
每个一维数组的默认初始化值是null。
可以对这三个一维数组分别进行初始化
arr[0] = new int[3];
arr[1] = new int[1];
arr[2] = new int[2];
格式三 int[][] arr = {{1,5,8},{6,6,36,58},{74};
int[][] arr = new int[3][2];
System.out.println(arr[0].length);
System.out.println(arr);//直接打印二维数组
System.out.println(arr[0]);//直接打印二位数组中角标为0的,一维数组
System.out.println(arr[0][1]);//直接打印二位数组中角标为0的,一维数组中角标为1的元素
遍历二维数组
int[][] arr = {{15,56,78,95},{85,48,235},{49,69}};
for (int i = 0; i < arr.length; i++) {
System.out.print('[');
for (int j = 0; j < arr.length; j++) {
if(j!=arr.length-1){
System.out.print(arr[j]+",");
}else{
System.out.println(arr[j]+"]");
}
}
}
数组工具类和文档注释总结
public class ArrayToolDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//数组工具对象的建立
int[] arr = {4,3,6,8,9,5,30};
/*int maxIndex = 0;
for (int i = 1; i < arr.length; i++) {
if(arr>arr[maxIndex])
maxIndex = i;
}*/
//ArrayTool tool = new ArrayTool();对象的建立无意义,浪费内存空间
int max = ArrayTool.getMax(arr);//int max = tool.getMax(arr);
System.out.println("max="+max);
int index = ArrayTool.getIndex(arr,4);//int index = tool.getIndex(arr,4);
System.out.println("index=" + index);
}
}
/**
建立一个 用于操作数组的工具类,其中包含着常见的对数组操作的函数,如:排序,获取最值,查找等
* @author peigen
* @version v1.0
*
*/
public class ArrayTool{//一个类文档化的前提是:必须是public权限。
//加上public后文件名和类名要一致,否则会编译失败。
private ArrayTool(){}//强制其不允许创建对象。
//该类的方法都是静态的,所以该类是不需要创建对象的 ,
//为了保证不让其他程序创建该类对象,可以将该类的构造函数私有化。
/**
获取整型数组的最大值。
@param arr 接收一个元素为int类型的数组。
@return 返回该数组中最大的元素。
*/
public static int getMax(int[] arr){//没有访问对象中的特有数据,所以静态化
int maxIndex = 0;
for (int i = 0; i < arr.length; i++) {
if(arr>arr[maxIndex])
maxIndex = i;
}
return arr[maxIndex];
}
/**
* 对数组进行选择排序
* @param arr 接收一个元素为int类型的数组。
*/
public static void selectSort(int[] arr){
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr>arr[j]) {
swap(arr, i, j);
}
}
}
}
/**
用于给数组进行元素的位置置换。
@param arr 接收一个元素为int类型的数组。
@param i
@param j
*/
private static void swap(int[] arr, int i, int j) {
int temp = arr;
arr = arr[j];
arr[j] = temp;
}
/**
* 获取指定元素在指定数组中的索引。
* @param arr接收一个元素为int类型的数组。
* @param key 要找的元素
* @return 返回该元素第一次出现的位置,如果不存在返回-1
*/
public static int getIndex(int[] arr,int key){
for (int i = 0; i < arr.length; i++) {
if(arr == key)
return i;
}
return -1;
}
/**
* 将int数组装潢成字符串。格式是[e1,e2……]
* @param arr 接收一个元素为int类型的数组
* @return 返回该数组的字符串表现形式。
*/
public static String arrayToString(int[] arr){
String str = "[";
for (int i = 0; i < arr.length; i++) {
if(i !=arr.length-1)
str = str + arr+ ", "
else
str = str + arr+ "]"
}
return str;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |