数组
1.数组
1.1.数组的概念
- 数组是引用类型,数组元素可以是基本数据类型也可以是引用数据类型
- 其实是个容器,是一组 相同类型的数据的容器;
- 数组元素指的就是数组种的数值
1.1.数组特性
1,数组长度一旦确定不能改变
2, 数组的索引从 0 开始;
3,数组的内存空间是连续的;访问数组非常
2.1.数组初始化3种
/**
* 数组的初始化方式
*/
public static void method1() {
int a;
//声明一个数组 数据类型[] 数组名
// int[] arr; //等价与 int arr[]
//1,第一种数组初始化, 数组的长度为 6
int[] arr = new int[6];
//2,第2种初始化
int[] arr2 = {67, 90, 78, 99}; // 0-3
// 3,第3种初始化
int[] arr3 = new int[]{67, 78, 99, 55};
}
2.2.数组的使用
1,数组元素赋值
/**
* 给数组元素赋值和取值
*/
public static void method2() {
double[] stuScores = new double[10];
//1,如何求数组长度
System.out.println("数组长度" + stuScores.length);
//2,取出数组元素的值 索引号 0-(数组长度-1)
System.out.println(stuScores[0]);
//3,给数组元素赋值
stuScores[0] = 98;
System.out.println(stuScores[0]);
//依次给数组元素赋值
for (int i = 0; i < stuScores.length; i++) {
stuScores[i] = Math.random() * 100;
}
//循环遍历所有的数组元素
for (int i = 0; i < stuScores.length; i++) {
System.out.println(stuScores[i]);
}
}
2,使用数组的计算均值,最值
/**
* 使用数组得到学生成绩的 平均值 最值
*/
public static void method3() {
Scanner sc = new Scanner(System.in);
System.out.println("请录入学生人数:");
int stuNum = sc.nextInt();
//此数组用来存放学生成绩
int[] scores = new int[stuNum];
int sum = 0;
for (int i = 0; i < stuNum; i++) {
int score = (int) (Math.random() * 100);
scores[i] = score;
sum += scores[i];
System.out.println("第" + (i + 1) + "个学生成绩是:" + score);
}
System.out.println("总的成绩:" + sum);
System.out.println("平均成绩:" + sum / stuNum);
// 得到最大值 ,最小值;先假设第一个就是最大值,循环进行比较
int maxScore = scores[0], maxIndex = 0;
int minScore = scores[0], minIndex = 0;
for (int i = 1; i < scores.length; i++) {
if (maxScore < scores[i]) {
maxScore = scores[i];
maxIndex = i;
}
if (minScore > scores[i]) {
minScore = scores[i];
minIndex = i;
}
}
System.out.println("最高成绩为 " + maxScore + "索引值是 " + maxIndex);
System.out.println("最低成绩为 " + minScore + "索引值是 " + minIndex);
}
3,数组的拷贝,引用的直接赋值和值的拷贝
/**
* 数组的拷贝
*/
public static void method4() {
int[] arr1 = {34, 56, 78, 99};
// 直接把arr1的引用赋值给arr2 ,引用的直接拷贝
/*int[] arr2 = arr1;
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
//改变数组arr1的数组元素值
arr1[1] = 69;
System.out.println(arr2[1]);*/
//数组元素值的拷贝
int[] arr2 = new int[arr1.length];
for (int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
arr1[1] = 69;
System.out.println(arr2[1]);
}
4,数组的遍历
/**
* 数组元素的2种遍历方式
*/
public static void method5() {
int[] arr = {66, 56, 87, 99, 50};
// 1,普通for循环遍历
/* for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}*/
//2,增强for循环遍历
for (int b : arr) {
System.out.println(b);
}
}
2.3. Arrays工具类的使用
/**
* Arrays是个工具类,里面封装的是操作数组相关的方法;
*/
public static void method6() {
int[] arr = {66, 56, 87, 99, 50, 2, 1};
double[] dos = {5.6, 9.8, 2.3};
int a = 10;
//1,把数组元素以字符串形式打印出来
System.out.println(Arrays.toString(arr));
// 2,对数组元素进行排序,源数组发生改变
/* Arrays.sort(arr);
System.out.println("============");
System.out.println(Arrays.toString(arr));*/
// 3,对数组进行拷贝,第二个参数newLength代表新数组的长度,与源数组不一定相等,如果大于源数组长度会赋默认值(int是0,double是0.0)
int[] arr2 = Arrays.copyOf(arr, 10);
System.out.println(Arrays.toString(arr2));
}
2.4.多维数组-二维数组
1,二维数组的初始化
/**
* 二维数组的使用,二维数组里面的数组元素是一维数组
*/
public static void method7() {
//3表示有3个一维数组,每个一维数组长度是2
int[][] a1 = new int[3][2];
a1[0][0] = 1;
a1[0][1] = 2;
a1[1][0] = 3;
a1[1][1] = 4;
a1[2][0] = 5;
a1[2][1] = 6;
//增强for+Arrays.toString打印
for (int[] ints : a1) {
System.out.println(Arrays.toString(ints));
}
//结果
[1, 2]
[3, 4]
[5, 6]
2,二维数组的使用,录入多个班级的学生成绩
/**
* 使用二维数组保存多个班级的成绩 3 1(20) 2(30) 3(35)
*/
public static void method8() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入班级个数:");
int classNum = sc.nextInt();
int[][] stuScore = new int[classNum][];
for (int i = 0; i < stuScore.length; i++) {
System.out.println("请输入第" + (i + 1) + "班级人数:");
int stuNum = sc.nextInt();
stuScore[i] = new int[stuNum];
}
//依次给 每个班的每个学生的成绩进行赋值
for (int i = 0; i < classNum; i++) {
for (int j = 0; j < stuScore[i].length; j++) {
stuScore[i][j] = (int) (Math.random() * 100);
}
}
//遍历每个班 每个学生的成绩
for (int i = 0; i < classNum; i++) {
System.out.println(Arrays.toString(stuScore[i]));
}
}
2.方法
2.1.方法的定义
- 其实实现一个功能的代码片段; 封装到方法中 可以实现代码重用
2.2.如何声明一个方法
1,声明方法。形参是方法声明时的参数,实参是实际调用时的传值
/**
* 方法:其实实现一个功能的代码片段; 封装到方法中 可以实现代码重用
* 权限修饰符 static不是必须的 void代表方法没有返回值(有返回值的话要加return关键字) 方法名-首字母小写遵守驼峰标志(方法参数列表)
* return 只能返回一个值
*/
public static int[] sortDescent(int[] sortArr) {
Arrays.sort(sortArr);
// System.out.println(Arrays.toString(sortArr));
int[] newArr = new int[sortArr.length];
int index = 0;
for (int i = sortArr.length - 1; i >= 0; i--) { //4,3,2
newArr[index] = sortArr[i];
index++;
}
// System.out.println(Arrays.toString(newArr));
return newArr;
}
/**
* op1,op2 方法形参;add(10, 20)真正调用的时候10,20称为方法的实参
*
* @return 把值返回给调用者
*/
public static int add(int op1, int op2) {
int sum = op1 + op2;
return sum;
}
2,使用方法(调用方法)
//调用方法
sortDescent(aa);
sortDescent(bb);
sortDescent(cc);
// int cc = add(10, 20);
method2(10, "ss");
3,定义方法(四类)
/**
* 有参数有返回值
*
* @param str1
* @param a
* @param b
* @return
*/
public static String method4(String str1, int a, double b) {
return "";
}
/**
* 无参数有返回值,一定要有return关键字
*
* @return
*/
public static double method3() {
System.out.println("");
double d = 2.2;
return d;
}
/**
* 有参数无返回值
*
* @param op
* @param str
*/
public static void method2(int op, String str) {
System.out.println("执行代码逻辑");
}
/**
* 无参无返回值 进行调用的时候 method1();
*/
public static void method1() {
System.out.println("========");
System.out.println("========");
System.out.println("========");
System.out.println("========");
}
2.3.方法的重载
2.3.1.什么是方法重载(overload)
- 方法名相同,参数列表不同(参数个数不同,参数类型不同,参数顺序不同)
- 例如Arrays.sort(int[] a) 就是方法的重载
public static double[] sortDescent(double[] sortArr) {
return null;
}
public static float[] sortDescent(float[] sortArr) {
return null;
}
2.4.方法递归调用
- 方法自己调用自己
/**
* 斐波那契数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368……
* @param number
* @return
*/
public static int fibonacci(int number) {
if (number == 1 || number == 0) {
return number;
} else {
return fibonacci(number - 1) + fibonacci(number - 2);
}
}
注意点:
递归调用层次过深 会发生栈空间溢出
3.排序算法
1,冒泡排序
算法原理:
将相邻的两个元素进行比较,最大的值放在右端。
N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。
/**
* 冒泡排序
*/
public static void bubbleSort(int[] sort) {
int temp;
//外层总共进行了数组长度-1趟
for (int i = 0; i < sort.length - 1; i++) {
for (int s = 0; s < sort.length - 1 - i; s++) {
if (sort[s] > sort[s + 1]) {
temp = sort[s];
sort[s] = sort[s + 1];
sort[s + 1] = temp;
}
}
System.out.println(Arrays.toString(sort));
}
}
2,选择排序
算法原理:
从第一个元素开始,分别与后面的元素相比较,找到最小的元素与第一个元素交换位置;从第二个元素开始,分别与后面的元素相比较,找到剩余元素中最小的元素,与第二个元素交换;重复上述步骤,直到所有的元素都排成由小到大为止。
/**
* 选择排序,每轮循环都会找到一个最小值所在的索引
*
* @param sort
*/
public static void selectionSort(int[] sort) {
int minIndex, temp;
for (int i = 0; i < sort.length - 1; i++) {
minIndex = i;
for (int j = i + 1; j < sort.length; j++) {
if (sort[minIndex] > sort[j]) {
minIndex = j;
}
}
// 互换位置
if (i != minIndex) {
temp = sort[i];
sort[i] = sort[minIndex];
sort[minIndex] = temp;
}
System.out.println(Arrays.toString(sort));
}
}
3,插入排序
算法原理:
将指针指向某个元素,假设该元素左侧的元素全部有序,将该元素抽取出来,然后按照从右往左的顺序分别与其左边的元素比较,遇到比其大的元素便将元素右移,直到找到比该元素小的元素或者找到最左面发现其左侧的元素都比它大,停止.
此时会出现一个空位,将该元素放入到空位中,此时该元素左侧的元素都比它小,右侧的元素都比它大;
/**
* 插入排序
* @param sort
*/
public static void insertSort(int[] sort) {
int leftIndex, current;
for (int i = 1; i < sort.length; i++) {
leftIndex = i - 1;
current = sort[i];
while (leftIndex >= 0 && sort[leftIndex] > current) {
sort[leftIndex + 1] = sort[leftIndex];
leftIndex--; //
}
//插入的索引值
sort[leftIndex + 1] = current;
System.out.println(Arrays.toString(sort));
}
}