数组的使用
-
普通的For循环
public class ArrayDemo3 {
public static void main(String[] args) {
int[] arrays={1,2,3,4,5};
//打印全部的数组元素
for (int i = 0; i < arrays.length; i++) {
System.out.println(arrays[i]);
}
System.out.println("============");
//计算所有元素的和
int sum=0;
for (int i = 0; i < arrays.length; i++) {
sum +=arrays[i];//sum=sum+arrays[i];
}
System.out.println("sum="+sum);
System.out.println("============");
//查找最大元素
int max=arrays[0];
for (int i = 1; i < arrays.length; i++) {
if(arrays[i]>max){
max=arrays[i];
}
}
System.out.println("max="+max);
}
}
-
For-Each 循环
-
数组作方法入参
-
数组作返回值
public class ArrayDemo04 {
public static void main(String[] args) {
int[] arrays={1,2,3,4,5};
// //JDK1.5,没有下标
// for(int array:arrays){
// System.out.println(array);
// }
// printArray(arrays);
int[] reverse=reverse(arrays);
printArray(reverse);
}
//反转数组
public static int[] reverse(int[] arrays){
int[] result=new int[arrays.length];
//反转的操作
for (int i = 0,j=result.length-1; i < arrays.length; i++,j--) {
result[j]=arrays[i];
}
return result;
}
//打印数组元素
public static void printArray(int[] arrays){
for (int i = 0; i < arrays.length; i++) {
System.out.println(arrays[i]+" ");
}
}
}
数组的四个基本特点
-
其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
-
其元素必须是相同类型,不允许出现混合类型。
-
数组中的元素可以是任何数据类型,包括基本类型和引用类型。
-
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
多维数组
-
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
-
二维数组
int a[][]=new int[2][5];
-
解析:以上二维数组 a可以看成一个两行五列的数组.
-
思考:多维数组的使用?
num[1] [o];
package base.array;
public class ArrayDemo05 {
public static void main(String[] args) {
//[4][2]
/*
1,2 arrar[0]
2,3 arrar[1]
3,4 arrar[2]
4,5 arrar[3]
*/
int[][]array={{1, 2},{2,3},{3, 4},{4,5}};
System.out.println(array[0][0]);
System.out.println(array[0][1]);
System.out.println("=========");
System.out.println(array.length);
System.out.println("=========");
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.println(array[i][j]);
}
}
}
}
Arrays类
-
数组的工具类java.util.Arrays
-
由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
-
查看JDK帮助文档
-
Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而“不用“使用对象来调用(注意:是”不用”而不是“不能“)
-
具有以下常用功能:
-
给数组赋值:通过 fill 方法。
-
对数组排序:通过 sort方法,按升序。
-
比较数组:通过 eguals方法比较数组中元素值是否相等。
-
查找数组元素:通过 binarySearch方法能对排序好的数组进行二分查找法操作。
-
package base.array;
import java.lang.reflect.Array;
import java.util.Arrays;
public class ArrayDemo06 {
public static void main(String[] args) {
int[] a={1,2,3,4,9090,31231,543,21,3,23};
System.out.println(a);//[I@4554617c
//打印数组元素Arrays.toString
//System.out.println(Arrays.toString(a));
Arrays.sort(a);//数组进行排序:升序
System.out.println(Arrays.toString(a));
Arrays.fill(a,2,4,0);//数组填充
System.out.println(Arrays.toString(a));
}
//不用方法打印
public static void printArray(int[] a){
for (int i = 0; i < a.length; i++) {
if (i==0){
System.out.print("[");
}
if (i==a.length-1){
System.out.print(a[i]+"]");
}else{
System.out.print(a[i]+", ");
}
}
}
}
冒泡排序
-
冒泡排序无疑是最为出名的排序算法之一,总共有八大排序!
-
冒泡排序过程
第一轮排序:按照冒泡排序的原理,比较相邻两个数字的大小。从数列末端开始,第1次比较7和6的大小。7>6,交换7和6的位置。把较大的那个数7交换到靠后的位置。
第2次排序比较4和6的大小。6比4大,不需要交换位置。第3次排序比较8和4的大小。4比8小,交换4和8的位置位置。
第4次排序比较2和4的大小。4比2大,不需要交换位置。第5次排序比较2和1的大小。2比1大,不需要交换位置。
第6次排序比较1和3的大小。1比3小,交换1和3的位置。第7次排序比较1和9的大小。1比9小,交换1和9的位置。
第8次排序比较1和5的大小。1比5小,交换1和5的位置。
第一轮排序结束, 成功的将序列中最小的数1交换到了队列最前面。
第二轮排序:过程与前一轮类似,依然从末尾开始进行相邻两个元素的比较当前面的元素比后面的元素大,交换两个元素的位置,第二轮排序只需要进行7次比较
经过第二轮排序后,数列中最小的两个元素已经交换到数列的最前面。
第三轮排序:依旧是回到数列的末尾,重新比较相邻的两个元素。
经过六次比较后,第三轮排序完成, 1,2,3三个最小的元素移动到了数列的头部。
第四轮排序:经过五次比较,第四轮排序完成后,1,2,3,4四个最小的元素移动到了数列的头部。
完整的排序过程需要经过八轮比较(9个元素),后四轮的排序过程与前面类似,经过八轮排序后,排序过程完成。
-
冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人尽皆知。
-
我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为0(n2)。
import java.util.Arrays;
public class ArrayDemo07 {
//冒泡排序
//1.比较数组中两个相邻的元素,如果第一个数大于第二个数,交换它们位置
//2.每一次比较,都会产生一个最大或最小的数字(升序为最大数)
//3.下一轮则可以少一次排序
//4.依次循环,直到结束
public static void main(String[] args) {
int[] a={18,22,65,2,7,-8};
int[] sort = sort(a);
System.out.println(Arrays.toString(sort)); //[-8, 2, 7, 18, 22, 65]
}
public static int[] sort(int[] array){
int temp=0;
//外层循环,次数length-1
for (int i = 0; i < array.length-1; i++) {
boolean flag=false;//通过flag标识位减少没有意义的比较
//内层循环:如果第一个数大于第二个数,交换它们位置
for (int j = 0; j < array.length-1-i; j++) {
if(array[j]>array[j+1]){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
flag=true;
}
}
if (flag==false){//优化
break;
}
}
return array;
}
}
-
思考:如何优化?
稀疏数组
-
需求:编写五子棋游戏中,有存盘退出和续上盘的功能。
-
分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据。
-
解决:稀疏数组
稀疏数组介绍
-
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
-
稀疏数组的处理方式是:
-
记录数组一共有几行几列,有多少个不同值
-
把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
-
-
如下图:左边是原始数组,右边是稀疏数组
package base.array;
public class ArrayDemo08 {
public static void main(String[] args) {
//创建一个二维数组 11*11 0:没有棋子,1:黑棋 2:白棋
int[][] array1 = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
//输出原始的数组
System.out.println("原始的数组:");
for (int[] array : array1) {
for (int i : array) {
System.out.print(i+"\t");
}
System.out.println();
}
//转换为稀疏数组保存
//1.有效值的个数
int sum = 0; //有效值总数
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if(array1[i][j]!=0){
sum++;
}
}
}
//2.创建一个稀疏数组
int[][] array2 = new int[sum+1][3];
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = sum;
//3.遍历二维数组,将有效值存放到稀疏数组
int count = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if(array1[i][j]!=0){
count++;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
}
}
}
//4.输出稀疏数组
System.out.println("稀疏数组:");
for (int i = 0; i < array2.length; i++) {
for (int j = 0; j < array2[i].length; j++) {
System.out.print(array2[i][j]+"\t");
}
System.out.println();
}
/* 结果:
输出原始的数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
稀疏数组
11 11 2
1 2 1
2 3 2
*/
}
}
学习视频地址: https://b23.tv/ajyHDBK
标签:Java,记录,int,System,数组,println,第十二天,array,out From: https://blog.csdn.net/weixin_71411945/article/details/136663131