稀疏数组
当面对一个十分庞大的数组而其中非零的数却又少的可怜的时候 可以用稀疏数组存储能节少不少空间
如下面这个数组
0 0 0 0 0 0 0 5 0
0 0 0 0 0 0 4 0 0
0 0 0 0 0 3 0 0 0
0 0 0 0 2 0 0 0 0
0 0 0 1 0 0 0 0 0
如果用一般二维数组存储就很浪费空间
但是用稀疏数组存储就会这样
9 5 5
0 7 5
1 6 4
2 5 3
3 4 2
4 3 1
这样就节省了大量的空间
用一个二维数组来存储原二维数组中有有效值的行数列数以及值,这就是稀疏数组
接下来我们来介绍稀疏数组的具体实现
/**
* @auther Devil(丁杨维)
* @create 2021-10-08-21:43
*/
//稀疏数组
public class E_24 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int row, cow;
System.out.println("请输入行数与列数(空格隔开):");
row = sc.nextInt();
cow = sc.nextInt();
//输入原数组;
int[][] arrays = new int[row][cow];
for(int i=0; i<row; i++) {
for (int j = 0; j < cow; j++) {
arrays[i][j] = sc.nextInt();
}
}
//输出原数组
System.out.println("输出原数组:");
for (int[] array : arrays) {
for (int i : array) {
System.out.print(i+"\t");
}
System.out.println();
}
int sum = 0;
for(int i=0; i<row; i++){
for(int j=0; j<cow;j++){
if(arrays[i][j]!=0){
sum++;
}
}
}
System.out.println("有效个数为"+sum);
int[][] arrays1 = new int[sum+1][3];
arrays1[0][0] = row;
arrays1[0][1] = cow;
arrays1[0][2] = sum;
int cnt = 0;
for(int i=0; i<row; i++){
for(int j=0; j<cow;j++){
if(arrays[i][j]!=0){
cnt++;
arrays1[cnt][0] = i;
arrays1[cnt][1] = j;
arrays1[cnt][2] = arrays[i][j];
}
}
}
System.out.println("============================================");
System.out.println("输出稀疏数组(输出格式的第一行为原数组的总行数与总列数以及含有的有效个数)");
for (int[] ints : arrays1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("============================================");
//稀疏数组转换原数组
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];
}
System.out.println("输出稀疏数组转化的原数组:");
for (int[] ints : arrays2) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
}
}
稀疏数组的第一行放的是原数组的总行数和总列数以及有效值的个数。
Scanner的一些注意事项
next()方法
- 对输入有效字符之前的遇到的空白,nex() 方法会将其去掉。
- 只有输入有效字符后才将其后面的空格作为分隔符或结束符。
- next() 不能得到带有空格的字符串(因为next()方法会将其当做分隔符或结束符对待)。
nextLine()方法
- 以Enter作为结束符,也就是说nextLine()方法返回的是回车前的所有字符。
- 可以获得空白字符