Java数据结构@稀疏数组

需求:将不必要的数据进行压缩以节省空间(如下图所示)

代码实现:

import java.util.Arrays;

/**
 * @ClassName: SparseArray
 * @Description: 
 * @Author: xuezhouyi
 * @Version: V1.0
 **/
public class SparseArray {
	public static void main(String[] args) {
		/* 构建左边的二维数组 */
		int[][] oriArr = new int[9][9];
		oriArr[3][3] = 1;
		oriArr[3][4] = 2;
		oriArr[3][5] = 3;
		oriArr[4][3] = 8;
		oriArr[4][5] = 4;
		oriArr[5][3] = 7;
		oriArr[5][4] = 6;
		oriArr[5][5] = 5;

		/* 打印原始数组 */
		for (int[] ints : oriArr) {
			System.out.println(Arrays.toString(ints));
		}
		/* 输出
			[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, 1, 2, 3, 0, 0, 0]
			[0, 0, 0, 8, 0, 4, 0, 0, 0]
			[0, 0, 0, 7, 6, 5, 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]
		* */

		/* 获取有效元素个数 */
		int count = 0;
		for (int[] ints : oriArr) {
			for (int anInt : ints) {
				if (anInt != 0) count++;
			}
		}
		System.out.printf("左边元素个数是:%d\n", count);
		/* 输出
			左边元素个数是:8
		* */

		/* 创建右边数组 */
		int[][] sparseArr = new int[count + 1][3];

		/* 写入第一组数据 */
		sparseArr[0][0] = oriArr.length;
		sparseArr[0][1] = oriArr.length;
		sparseArr[0][2] = count;

		/* 遍历原始数组并循环写入稀疏数组 */
		int index = 0;
		for (int i = 0; i < oriArr.length; i++) {
			for (int j = 0; j < oriArr[i].length; j++) {
				if (oriArr[i][j] != 0) {
					index++;
					sparseArr[index][0] = i;
					sparseArr[index][1] = j;
					sparseArr[index][2] = oriArr[i][j];
				}
			}
		}

		/* 打印稀疏数组 */
		for (int[] ints : sparseArr) {
			System.out.println(Arrays.toString(ints));
		}
		/* 输出
			[9, 9, 8]
			[3, 3, 1]
			[3, 4, 2]
			[3, 5, 3]
			[4, 3, 8]
			[4, 5, 4]
			[5, 3, 7]
			[5, 4, 6]
			[5, 5, 5]
		* */

		/* 至此我们已经成功将数据进行了压缩,接着就来解压缩,首先创建一个新的二维数组 */
		int[][] newArr = new int[sparseArr[0][0]][sparseArr[0][1]];

		/* 给新的二维数组初始化,注意这里要从第二行开始 */
		for (int i = 1; i <= sparseArr[0][2]; i++) {
			newArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
		}

		/* 打印新数组 */
		for (int[] ints : newArr) {
			System.out.println(Arrays.toString(ints));
		}
		/* 输出
			[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, 1, 2, 3, 0, 0, 0]
			[0, 0, 0, 8, 0, 4, 0, 0, 0]
			[0, 0, 0, 7, 6, 5, 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]
		* */
	}
}
发布了54 篇原创文章 · 获赞 19 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/DataIntel_XiAn/article/details/99689863