多维数组
-
多维数组可以看成是数组的的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
-
二维数组
int a[][] = new int[2][5];
-
解析:以上二维数组a可以看成一个两行五列的数组。
二维数组使用1:
package com.zhai.array;
public class Arrays1 {
//二维数组
public static void main(String[] args) {
// 定义一个二维数组{}为一组,
int[][] a = {{1,2,3},{4,5,6},{7,8,9}};
// 0 , 1 , 2
System.out.println(a[0][0]);
System.out.println(a[1][0]);
System.out.println(a[1][1]);
System.out.println(a[2][0]);
//输出所有数组
for (int i = 0; i < a.length ; i++) {
for (int j = 0; j <a[i].length ; j++) {
System.out.print(a[i][j]+" ");
}
}
}
}
输出:
1
4
5
7
1 2 3 4 5 6 7 8 9
二维数组使用2:
package com.zhai.array;
public class Arrays2 {
public static void main(String[] args) {
int[][] arrays = new int[2][2];
// 在这个数组中一共有2个一维数组,并且每一个一维数组的元素有2个
/**
* int[][] 第一个[]是一共有几个一位数组 ; 第二个[]是数组中元素的个数,比如你写个5,就说明这个数组的元素最多能写5个
* 就相当于这样:
* 1,2,3,4,5
* 6,7,8,9,10
*/
arrays[0][0] = 1; // 第一个一维数组的第一个数为1
arrays[0][2] = 2;
arrays[1][0] = 6; // 第二个一维数组的第一个数为6
arrays[1][1] = 7;
// arrays[2][1]=1; // 数组越界异常
System.out.println("第一个数组中的第二个数为:"+arrays[0][2]);
for (int i = 0; i < arrays.length ; i++) {
for (int j = 0; j < arrays[i].length; j++) {
System.err.print(arrays[i][j]+" ");
}
}
}
}
输出:
第一个数组中的第二个数为:2
1 2 6 7
注意:其实在二维数组中第一个[]是一共有几个一维数组,第二个[]是这个一维数组中有几个元素;二维数组也就相当于一维数组的两层嵌套,切记:取值一定是从下标0开始,否则就会报出数组越界异常!
数组中的Arrays类
- 数组中的工具类 java.util.Arrays。
- 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
- 查看JDK帮助文档。
- Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而”不用“对象来调用(注意:是”不用“不是”不能“)。
- 具有以下常用功能:
- 给数组赋值:通过 fill 方法。
- 对数组进行排序:通过 sort 方法,按升序。
- 比较数组:通过 equals 方法比较数组中元素值是否相等。
- 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法进行操作。
Arrayys类的使用:
package com.zhai.array;
import java.util.Arrays;
public class Arrays3 {
// 使用 Arrays 类
public static void main(String[] args) {
int[] a = {2,6,7,9,4,3,1,5};
// Arrays类中都是静态方法所以直接使用类名.方法名
Arrays.sort(a); // sort是排序方法,排序列表是升序
Arrays.fill(a,2,4,0); // 填充方法,可以把数组中的数据进行覆盖; 也可以进行选择型的覆盖
System.out.println(Arrays.toString(a)); // toString()方法可以进行打印输出
printA(a);
}
// 不使用工具类的情况下我们需要自己动手编写方法
public static void printA(int[] a){
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] +" ");
}
}
}
输出:
[1, 2, 0, 0, 5, 6, 7, 9]
1 2 0 0 5 6 7 9
解析:这里使用到了Arrays中的两个方法,第一个是:toString()方法,可以进行打印输出;第二个是:sort()方法,可以将数据进行升序的列表进行排序;fill方法是把数组中的数据进行覆盖,也可以尽心选择性的覆盖如:2,4,0意思就是把数组中下标为2~4之间的数据用0覆盖。
冒泡排序
- 在排序中共有八大排序,且用的最多以及最出名的就是冒泡排序。
package com.zhai.array;
import java.util.Arrays;
/*
冒泡排序
1、比较数组中,两个相邻的元素,如果第一个数比第二个数大,就要交换它们的位置
2、每一次比较,都会产生出一个最大,或者最小的数字;
3、下一轮测可以少一次排序
4、依次执行,直到结束
*/
public class Arrays4 {
public static void main(String[] args) {
int[] i = {5, 1, 3, 4, 6, 7, 8, 94, 2, 234};
int[] sort = sort(i);
System.out.println(Arrays.toString(i));
}
public static int[] sort(int[] a) {
int c = 0;
boolean b = false;
for (int i = 0; i < a.length - 1; i++) { // 让外层循环长度减1是为了不溢出
for (int j = 0; j < a.length - 1 - i; j++) {
// 减i的原因是每一次比较出来的总会有一个大,这个大的就不在进行这次循环下次循环将会继续
if (a[j+1] < a[j]) { // 也就是如果a数组中的后一个数字小于当前这个数字
c = a[j]; // 那么就将当前这个数字赋值给c
a[j] = a[j+1]; // 将后一个数字赋值给当前这个数字
a[j+1] = c; // 然后将当前的数字(c)的值赋值给后一个数字
b = true; // 优化排序
}
}
if (b == false){ // 当已经排好的数字就不再进入循环继续执行
break;
}
}
return a;
}
}
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 94, 234]
解析:其实就相当于两个杯子现在都装满水,但是现在想把它们两个进行交换,就需要一个空的杯子,就如:
注意:冒泡排序的时间复杂度为:o(n2);
稀疏数组(拓展)
- 稀疏数组它是一种数据结构(思想)。
- 当一个数组中大部分元素为0或者为同一值的数据时,可以使用稀疏数组来保存该数组。
- 稀疏数组的处理方式:
- 记录数组一共有几行几列,有多少个不同值;
- 把具有不同值的元素和行列几值记录在一个小规模的数组中,从而缩小程序的规模;
- 记录有效的坐标值。
稀疏数组的使用:
package com.zhai.array;
/*
稀疏数组
*/
public class Arrays5 {
public static void main(String[] args) {
int[][] arrays = new int[11][11];
arrays[1][2]=1;
arrays[2][3]=2;
for (int[] array : arrays) {
for (int a : array) {
System.out.print(a+ "\t");
}
System.out.println();
}
// 转换为稀疏数组保存
// 获取有效值的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11 ; j++) {
if (arrays[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值的个数:"+sum);
// 创建一个稀疏数组
int[][] arrays1 = new int[sum+1][3];
arrays1[0][0] = 11;
arrays1[0][1] = 11;
arrays1[0][2] = sum;
// 遍历二维数组,将非零的值,存放在稀疏数组中
int count = 0;
for (int i = 0; i < arrays.length; i++) {
for (int j = 0; j < arrays[i].length; j++) {
if (arrays[i][j]!=0){
count++;
arrays1[count][0] = i; //
arrays1[count][1] = j;
arrays1[count][2] = arrays[i][j];
}
}
}
// 输出
System.out.println("输出稀疏数组:");
for (int[] ints : arrays1) {
System.out.println(ints[0] + "\t"
+ ints[1] + "\t"
+ ints[2] + "\t");
}
// 还原原始数组
int[][] arrays2 = new int[arrays1[0][0]][arrays1[0][1]];
// 给其中的元素进行还原
for (int i = 1; i < arrays1.length; i++) {
arrays2[arrays1[i][0]][arrays1[i][1]] = arrays1[i][2];
}
// 输出
for (int[] array : arrays2) {
for (int a : array) {
System.out.print(a+ "\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
有效值的个数:2
输出稀疏数组:
11 11 2
1 2 1
2 3 2
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
含义:其实呢,稀疏数组的作用就是从一堆数据中把有值的取出来,变成一个小数组。