稀疏数组的学习
稀疏数组是为了减少记录无效数据,减少内存占用
package ss;
import java.util.concurrent.ForkJoinPool;
public class Demo04 {
public static void main(String[] args) {
//创建二维数组11*11 0:没有棋子 1. 黑棋 2.白棋
int[][] array1 = new int[11][11];
array1[1][2] = 1;
array1[2][3] =1;
//输出原始数组
System.out.println("输出原始数组");
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
//转换为稀疏数组
//获取有效值的个数
int sum = 0;
for (int i = 0; i < 11 ; i++) {
for (int j = 0; j < 11; j++) {
if (array1[i][j] != 0){
sum++;
}
}
}
System.out.println("有效值的个数"+ sum);
//创建一个稀疏数组的数组
int[][] array2 = new int[sum+1][3];
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = sum;
//遍历二维数组,将非零值存入稀疏数组
int count = 0;
for (int i = 0; i < array1.length ; i++) {
for (int j = 0; j < array1[1].length; j++) {
if (array1[i][j] != 0){
count++;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组:");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0]+"\t"
+array2[i][1]+"\t"
+array2[i][2]+"\t");
}
System.out.println("=============");
System.out.println("还原");
//读取稀疏数组
int[][] array3 = new int[array2[0][0]][array2[0][1]];
//2.给其他的元素还原它的值
for (int i = 1; i <array2.length ; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
//3.打印
//输出原始数组
System.out.println("输出原始数组");
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}
}
解释:
代码
for (int i = 0; i < array1.length ; i++) {
for (int j = 0; j < array1[1].length; j++) {
if (array1[i][j] != 0){
count++;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
}
}
}
索引的概念
在编程中,索引 是用来标识数组或集合中某个元素位置的整数。索引通常从 0 开始。例如,对于一个包含 5 个元素的数组:
- 第一个元素的索引是 0
- 第二个元素的索引是 1
- 以此类推,最后一个元素的索引是 4
代码中的 count
在你的代码中,count
用来跟踪稀疏数组 array2
中有效元素的个数,并决定在 array2
中的存储位置。每当找到一个非零元素时,count
增加 1。
具体的存储过程
假设 array1
是一个 11x11 的二维数组,其中有一些棋子。每当你找到一个棋子时,你就想把它的信息存入 array2
中。
-
找到一个棋子:
- 假设你发现
array1[1][2]
是一个黑棋(值为 1)。
- 假设你发现
-
自增
count
:count++
会把count
的值加 1,然后你可以使用这个新值来存储信息。假设count
之前是 0,现在变为 1。
-
存储信息到
array2
:javaarray2[count][0] = i; // 存储行索引 array2[count][1] = j; // 存储列索引 array2[count][2] = array1[i][j]; // 存储棋子颜色
array2[count][0]
会存储当前棋子的位置行索引i
。array2[count][1]
会存储当前棋子的位置列索引j
。array2[count][2]
会存储当前棋子的值(例如黑棋的值为 1)。
示例
假设在 array1
中找到两个棋子:
- 第一个棋子在位置
(1, 2)
,值为 1。 - 第二个棋子在位置
(2, 3)
,值为 1。
array2
的内容将会是:
array2[0] = {11, 11, 2} // 元信息:行数、列数、有效值的个数
array2[1] = {1, 2, 1} // 第一个棋子:行 1, 列 2, 值 1
array2[2] = {2, 3, 1} // 第二个棋子:行 2, 列 3, 值 1
在这个例子中,array2[1][0]
表示第一个棋子所在的行(1),array2[1][1]
表示列(2),array2[1][2]
表示棋子颜色(1)
//2.给其他的元素还原它的值
for (int i = 1; i <array2.length ; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
解释
-
循环的初始条件:
javafor (int i = 1; i < array2.length; i++) {
- 这个循环从
i = 1
开始 iterating,因为array2[0]
主要用于存储元信息(如行数、列数、有效元素数量),而实际的棋子信息是从array2[1]
开始的。 array2.length
是array2
的总行数,它包含所有的信息行(包括元信息)。
- 这个循环从
-
还原棋子位置:
javaarray3[array2[i][0]][array2[i][1]] = array2[i][2];
- 这行代码的目的是将
array2
中的有效棋子数据放回到array3
中。 array2[i][0]
是当前棋子在array1
中的行索引。array2[i][1]
是当前棋子在array1
中的列索引。array2[i][2]
是棋子对应的值(例如是黑棋还是白棋,一般用数字表示,例如 1 代表黑棋,2 代表白棋)
- 这行代码的目的是将
总结:
中的有效棋子数据放回到
array3` 中。
array2[i][0]
是当前棋子在array1
中的行索引。array2[i][1]
是当前棋子在array1
中的列索引。array2[i][2]
是棋子对应的值(例如是黑棋还是白棋,一般用数字表示,例如 1 代表黑棋,2 代表白棋)
总结:
主要是二位数组坐标问题,在使用稀疏数组时,注意有效值的坐标,可以通过坐标值来定位,赋予给新的数组