您的位置:首页 > 编程语言 > Java开发

【原】Java学习笔记011 - 数组

2017-02-26 11:40 281 查看
package cn.temptation;

import java.util.Scanner;

public class Sample01 {
public static void main(String[] args) {
// 需求:定义一个数组存储星期一、星期二、...星期日,打印该数组形式为[星期一, 星期二, ...星期日],根据用户输入的数字(1~7),显示是星期几?

// 写法一、考虑使用字符串类型的数组
//        // 1、创建一个数组来存储星期一、星期二、...星期日
//        String[] weekDayArr = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
//        printArray(weekDayArr);
//
//        // 2、接收键盘录入
//        System.out.println("输入一个数字就可以找到对应是星期几:");
//        Scanner input = new Scanner(System.in);
//        int weekDay = input.nextInt();
//        input.close();
//
//        // 3、判断输入的数字和数组中某个元素的索引之间的关系
//        if (weekDay >= 1 && weekDay <= 7) {
//            System.out.println("选择的是:" + weekDayArr[weekDay - 1]);
//        } else {
//            System.out.println("输入的数字不在范围内!");
//        }

// 写法二、考虑使用int类型的数组
// 1、创建一个数组来存储星期一、星期二、...星期日
int[] weekDayArr = { 1, 2, 3, 4, 5, 6, 7 };
printArray(weekDayArr);

// 2、接收键盘录入
System.out.println("输入一个数字就可以找到对应是星期几:");
Scanner input = new Scanner(System.in);
int weekDay = input.nextInt();
input.close();

// 3、判断输入的数字和数组中某个元素的索引之间的关系
if (weekDay >= 1 && weekDay <= 7) {
System.out.println("选择的是:" + convertNumberToString(weekDayArr[weekDay - 1]));
} else {
System.out.println("输入的数字不在范围内!");
}
}

/**
* 打印数组
* @param arr:字符串数组
*/
public static void printArray(String[] arr) {
System.out.print("[");

// 遍历数组
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}

// 换行
System.out.println();
}

/**
* 打印数组(重载方法)
* @param arr:int数组
*/
public static void printArray(int[] arr) {
System.out.print("[");

// 遍历数组
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}

// 换行
System.out.println();
}

/**
* 数字转换为星期字符串的方法
* @param i:数字
* @return:星期字符串
*/
public static String convertNumberToString(int i) {
String result = "";

switch (i) {
case 1:
result = "星期一";
break;
case 2:
result = "星期二";
break;
case 3:
result = "星期三";
break;
case 4:
result = "星期四";
break;
case 5:
result = "星期五";
break;
case 6:
result = "星期六";
break;
case 7:
result = "星期日";
break;
default:
result = "输入错误!";
break;
}

return result;
}
}


package cn.temptation;

public class Sample02 {
public static void main(String[] args) {
// 需求:给定一个int类型的数组,实现如下功能:将数组反转,比如:{1, 2, 3} -----> {3, 2, 1}, {1, 2, 3, 4} -----> {4, 3, 2, 1}

// 思路:
// 1、可能有两种情况,一种数组的长度为奇数,一种数组的长度为偶数
// 2、如果长度为奇数,中间那个元素不动,第一个元素和最后一个元素对调,第二个元素和倒数第二个元素对调,...,
//        中间那个元素的前一个元素和中间那个元素的后一个元素对调
// 3、如果长度为偶数,第一个元素和最后一个元素对调,第二个元素和倒数第二个元素对调,...,
//        中间位置的前一个元素和中间位置的后一个元素对调

int[] arr1 = { 1, 2, 3 };
System.out.println("反转前的数组:");
printArray(arr1);

// 调用方法
//        reversalArray1(arr1);
reversalArray2(arr1);

System.out.println("反转后的数组:");
printArray(arr1);

System.out.println("------------------------------");

int[] arr2 = { 1, 2, 3, 4 };
System.out.println("反转前的数组:");
printArray(arr2);

//        reversalArray2(arr2);
reversalArray1(arr2);

System.out.println("反转后的数组:");
printArray(arr2);

// 注意:
// 1、代码写完后,自己再考虑一下,不要抱着糊完任务的心态
// 2、思考问题的时候是区分了数组为奇数长度和偶数长度的,在编写代码时,发现对于奇数长度,因为其中间元素不参与反转,相当于反转时把中间元素拿掉
//        即其操作次数:(数组长度 - 1) / 2, 和 偶数长度数组的操作次数是一致的
}

/**
* 打印数组
* @param arr:int数组
*/
public static void printArray(int[] arr) {
System.out.print("[");

// 遍历数组
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}

// 换行
System.out.println();
}

/**
* 奇数长度的数组反转(因为后续的显示操作也是使用堆内存中的内容,所以该方法使用void:无返回即可)
* @param arr
*/
public static void reversalArray1(int[] arr) {
// 下面写法逻辑错误,这样会对调两次,等于没有对调
//        for (int i = 0, j = arr.length - 1; i < arr.length; i++, j--) {
for (int i = 0, j = arr.length - 1; i < arr.length / 2; i++, j--) {
// 对调:第一个元素和最后一个元素对调,第二个元素和倒数第二个元素对调,...,
//        中间那个元素的前一个元素和中间那个元素的后一个元素对调
// 定义临时变量接收
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}

/**
* 偶数长度的数组反转(因为后续的显示操作也是使用堆内存中的内容,所以该方法使用void:无返回即可)
* @param arr
*/
public static void reversalArray2(int[] arr) {
for (int i = 0; i < arr.length / 2; i++) {
// 对调:第一个元素和最后一个元素对调,第二个元素和倒数第二个元素对调,...,
//        中间位置的前一个元素和中间位置的后一个元素对调
// 定义临时变量接收
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
}
}


package cn.temptation;

public class Sample03 {
public static void main(String[] args) {
int[] arr = { 10, 20, 30 };
System.out.println(arr);        // [I@15db9742
System.out.println(arr[0]);        // 10

arr = null;

// 产生异常:java.lang.NullPointerException  空指针异常
// 有警告:Null pointer access: The variable arr can only be null at this location
//        System.out.println(arr[0]);

// 产生异常:java.lang.NullPointerException  空指针异常
// 有警告:Null pointer access: The variable arr can only be null at this location
//        System.out.println(arr.length);

// 下句语句执行时无异常
System.out.println(arr);        // null

// 注意:
// 1、设置引用类型变量的值为null,其实就是让其栈中声明的引用类型变量 与 在堆中开辟的空间之间的联系断开
// 2、堆中原来开辟的空间并不会立即消失

// null是一个特殊值,类比boolean类型的特殊值true 和 false
// null表示的是引用数据类型的空值,引用数据类型的默认值是null

// 如下两种写法意义相同
//        int[] arrExtend;
//        int[] arrExtend = null;

// null不能用于给基本数据类型(值类型)赋值,null只能用于引用数据类型
// 语法错误:Type mismatch: cannot convert from null to int
//        int i = null;
}
}


package cn.temptation;

public class Sample04 {
public static void main(String[] args) {
//        int[] arr = { 1, 2, 3 };
//        printArray(arr);

// 匿名数组:没有显示定义数组名的数组
// 这里匿名数组使用new关键字直接在内存的堆中开辟元素个数长度的空间,并存储这些元素,然后作为实参传递给方法的形参供方法使用

//        printArray(new int[] { 1, 2, 3 });

// 匿名数组的优点:直接new出来使用,不用再做声明
// 匿名数组的缺点:只能使用一次(因为没有声明数组变量,一次使用完毕后就找不到了)

// 注意:匿名数组定义时,不能使用静态初始化的简写形式,语法出错
// 语法错误:Syntax error on token "printArray", @ expected before this token
//        printArray({ 4, 5, 6 });

// 注意:匿名数组定义时,可以使用动态初始化的形式,但是这样定义后,无法进行元素的填充
printArray(new int[3]);
}

/**
* 打印数组
* @param arr:int数组
*/
public static void printArray(int[] arr) {
System.out.print("[");

// 遍历数组
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}

// 换行
System.out.println();
}
}


package cn.temptation;

public class Sample05 {
public static void main(String[] args) {
// 给方法传递值类型参数       和       给方法传递引用数据类型参数

int i = 1;
System.out.println(i);            // 1

// 调用方法
show(i);                        // 3

System.out.println(i);            // 1

System.out.println("------------------------------");

int[] arr = { 1, 2, 3 };
printArray(arr);                // [1,2,3]

// 调用方法
show(arr);                        // [3,4,5]

printArray(arr);                // [3,4,5]
}

// 方法接收的是值类型的参数
// i为形参,它接受show方法调用时传递过来的实参
// show方法中使用的i叫做局部变量,声明该局部变量的地方是形参定义的地方,也是它的作用域开始的地方,作用域结束的地方是show方法右侧的大括号
public static void show(int i) {
i += 2;
System.out.println("方法内的参数值为:" + i);
}

// 方法接收的是引用类型的参数
// 传递引用类型的参数,其实传递的是堆内存中开辟的空间的地址(也就是所谓的把引用传递了过去)
public static void show(int[] arr) {
// 遍历数组
for (int i = 0; i < arr.length; i++) {
arr[i] += 2;
}

// 打印数组
printArray(arr);
}

/**
* 打印数组
* @param arr:int数组
*/
public static void printArray(int[] arr) {
System.out.print("[");

// 遍历数组
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}

// 换行
System.out.println();
}
}


package cn.temptation;

public class Sample06 {
public static void main(String[] args) {
// 可变长参数:Java中当作数组处理
// 可变长参数一般出现在方法的形参中

// 调用方法
show(1, new double[] { 2, 3, 4 });

double[] arr = { 5, 6, 7 };
show(9, arr);
}

// 正确形式使用可变长参数
public static void show(int i, double... ds) {
System.out.println(i);                // 1

System.out.println(ds);                // [D@15db9742
System.out.println(ds.length);        // 3

// 遍历
for (double item : ds) {
System.out.println(item);
}
}

// 注意:一个方法只能有一个可变长参数,且必须位于参数列表的最后位置

// 语法错误:The variable argument type double of the method test must be the last parameter
//    public static void test(int i, double... ds, char... ch) {
//        // 想创建多个可变长参数的方法
//    }

// 语法错误:The variable argument type double of the method test must be the last parameter
//    public static void test(int i, double... ds, boolean flag) {
//        // 想创建可变长参数不在最后位置的方法
//    }
}


package cn.temptation;

public class Sample07 {
public static void main(String[] args) {
// 排序

// 冒泡排序(两两位置比较,每轮最大数字出现在右侧,依次向左)
// 思路:
// 1、第一轮,比较第1个位置和第2个位置上的数,将较小的数放在第1个位置上,较大的数放在第2个位置上
//             比较第2个位置和第3个位置上的数,将较小的数放在第2个位置上,较大的数放在第3个位置上
//            以此类推直到第一轮结束(最后一个位置不用参与比较,因为它的右侧没有位置了),最大的数字在最右侧
// 2、第二轮,还是比较第1个位置和第2个位置上的数,将较小的数放在第1个位置上,较大的数放在第2个位置上
//            比较第2个位置和第3个位置上的数,将较小的数放在第2个位置上,较大的数放在第3个位置上
//                以此类推直到第二轮结束(倒数第二个位置不用参与比较,因为它的右侧已经是最大的数了),第二大的数字在倒数第二个
// 3、后续的轮以此类推

int[] arr = { 2, 1, 0, 4, 3 };

System.out.println("排序前:");
printArray(arr);

// 冒泡排序算法
for (int i = 0; i < arr.length - 1; i++) {        // 外层循环的轮数是数组长度 - 1,i表示的是当前为第几轮
for (int j = 0; j < arr.length - 1 - i; j++) {    // j表示的当前轮中的位置
// 相邻的两个位置上的数做比较
if (arr[j] > arr[j + 1]) {
// 对调
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}

// 可以使用打印数组的方法查看当轮排序结果
printArray(arr);
}

System.out.println("排序后:");
printArray(arr);
}

/**
* 打印数组
* @param arr:int数组
*/
public static void printArray(int[] arr) {
System.out.print("[");

// 遍历数组
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}

// 换行
System.out.println();
}
}


package cn.temptation;

public class Sample08 {
public static void main(String[] args) {
// 排序

// 选择排序
// 思路:
// 1、第一轮,把在第一个位置上的元素依次和后续位置上的元素进行比较,如果被比较的元素比第一个位置上的元素小,就对调,直到比较到最后一个位置上的元素
//             第一轮操作完成后,在第一个位置上得到最小的那个元素
// 2、第二轮,把在第二个位置上的元素依次和后续位置上的元素进行比较,如果被比较的元素比第二个位置上的元素小,就对调,直到比较到最后一个位置上的元素
//             第二轮操作完成后,在第二个位置上得到次小的那个元素
// 3、以此类推

int[] arr = { 2, 1, 0, 4, 3 };

System.out.println("排序前:");
printArray(arr);

// 选择排序算法
for (int i = 0; i < arr.length - 1; i++) {        // 外层循环的i既表示轮数,又表示比较的位置
// 第一轮,把在第一个位置上的元素依次和后续位置上的元素进行比较,如果被比较的元素比第一个位置上的元素小,就对调,直到比较到最后一个位置上的元素
//            if (arr[0] > arr[1]) {
//                // 对调
//                int temp = arr[0];
//                arr[0] = arr[1];
//                arr[1] = temp;
//            }
//            if (arr[0] > arr[2]) {
//                // 对调
//                int temp = arr[0];
//                arr[0] = arr[2];
//                arr[2] = temp;
//            }

// 归纳上述语句,可以得到规律
for (int j = i + 1; j < arr.length; j++) {        // 内层循环的j表示其他被比较的位置
if (arr[i] > arr[j]) {
// 对调
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}

// 可以使用打印数组的方法查看当轮排序结果
printArray(arr);
}

System.out.println("排序后:");
printArray(arr);
}

/**
* 打印数组
* @param arr:int数组
*/
public static void printArray(int[] arr) {
System.out.print("[");

// 遍历数组
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}

// 换行
System.out.println();
}
}


package cn.temptation;

public class Sample09 {
public static void main(String[] args) {
// 排序

// 插入排序
// 思路:
// 1、第一轮,从第2个位置开始,和其左侧的紧靠着它的位置的数(第1个位置上的数)进行比较,小的数放前面,大的数放后面
// 2、第二轮,从第3个位置开始,和其左侧的紧靠着它的位置的数(第2个位置上的数)进行比较,小的数放前面,大的数放后面
//             再看第2个位置,和其左侧的紧靠着它的位置的数(第1个位置上的数)进行比较,小的数放前面,大的数放后面
// 3、第三轮,从第4个位置开始,和其左侧的紧靠着它的位置的数(第3个位置上的数)进行比较,小的数放前面,大的数放后面
//             再看第3个位置,和其左侧的紧靠着它的位置的数(第2个位置上的数)进行比较,小的数放前面,大的数放后面
//             再看第2个位置,和其左侧的紧靠着它的位置的数(第1个位置上的数)进行比较,小的数放前面,大的数放后面
// 4、以此类推

int[] arr = { 2, 1, 0, 4, 3 };

System.out.println("排序前:");
printArray(arr);

// 插入排序算法
for (int i = 1; i < arr.length; i++) {            // 外层循环的i既表示轮数,又表示位置
//            // 第一轮操作
//            if (arr[0] > arr[1]) {
//                // 对调
//                int temp = arr[0];
//                arr[0] = arr[1];
//                arr[1] = temp;
//            }
//
//            // 第二轮操作
//            if (arr[1] > arr[2]) {
//                // 对调
//                int temp = arr[1];
//                arr[1] = arr[2];
//                arr[2] = temp;
//            }
//            if (arr[0] > arr[1]) {
//                // 对调
//                int temp = arr[0];
//                arr[0] = arr[1];
//                arr[1] = temp;
//            }

// 归纳上述操作,得到规律
// 写法一
for (int j = i; j > 0; j--) {        // 内层循环的j表示当前的这个位置
if (arr[j] < arr[j - 1]) {        // // 内层循环的当前的这个位置上的数 和 其左侧紧靠着它的位置上的数进行比较
// 对调
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}

// 写法二
//            for (int j = 0; j < i; j++) {        // 内层循环的j表示从第1个位置开始配合进行比较
//                if (arr[j] > arr[i]) {
//                    // 对调
//                    int temp = arr[i];
//                    arr[i] = arr[j];
//                    arr[j] = temp;
//                }
//            }
}

System.out.println("排序后:");
printArray(arr);
}

/**
* 打印数组
* @param arr:int数组
*/
public static void printArray(int[] arr) {
System.out.print("[");

// 遍历数组
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}

// 换行
System.out.println();
}
}


package cn.temptation;

import java.util.Arrays;

public class Sample10 {
public static void main(String[] args) {
// 初始化数组
int[] arr = { 2, 1, 0, 4, 3 };

System.out.println("排序前:");
printArray(arr);

// 可以调用Arrays类的sort方法进行排序
// 类 Arrays:此类包含用来操作数组(比如排序和搜索)的各种方法。
// 常用的成员方法:
// static void sort(int[] a) :对指定的 int 型数组按数字升序进行排序。
Arrays.sort(arr);

System.out.println("排序后:");
printArray(arr);
}

/**
* 打印数组
* @param arr:int数组
*/
public static void printArray(int[] arr) {
System.out.print("[");

// 遍历数组
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}

// 换行
System.out.println();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: