Java数据结构实现二维数组与稀疏数组转换详解

Java数据结构实现二维数组与稀疏数组转换详解

一、二维数组与稀疏数组

在介绍二维数组与稀疏数组的转换之前,需要先了解它们的定义和特点。

1.二维数组

二维数组是一个由多个一维数组组成的数组。可以将它理解为是一个由行和列构成的矩阵。其中,行和列的数量是固定的,而且必须预先指定。

二维数组的声明方式为:

数据类型[][] 数组名;

例:

int[][] arr;

二维数组的初始化方式有两种:

1.静态初始化:在声明的同时为数组元素赋初值。

数据类型[][] 数组名 = {{元素1,元素2,...},{元素1,元素2,...},...};

例:

int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};

2.动态初始化:在声明数组时只指定数组元素的类型和数量,然后再分别为每个数组元素赋初值。

数据类型[][] 数组名 = new 数据类型[行数][列数];

例:

int[][] arr = new int[3][3];
arr[0][0] = 1;
arr[0][1] = 2;
...

2.稀疏数组

稀疏数组是一种压缩存储的数组。它通常应用在当数组中大部分的元素值为默认值或者某一个值的情况下。稀疏数组通常由3列组成,分别为:行数、列数以及具体数值。通常情况下,稀疏数组的行数为原数组中有效元素的个数+1,列数为3。

稀疏数组的转换过程如下:

1.遍历原数组,得到有效元素的个数count;
2.根据count+1创建一个稀疏数组sparse_arr;
3.将sparse_arr的第一行赋值为原数组的行数、列数和有效元素的个数;
4.遍历原数组,将每个非0的元素的行列和值存入稀疏数组sparse_arr中。

示例:

原始数组为:

int[][] arr = {{0,0,0,0,0},
               {0,0,1,0,0},
               {0,0,0,2,0},
               {0,0,3,0,0},
               {0,0,0,0,0}};

转换为稀疏数组后的结果为:

sparse_arr = {{5,5,3},
              {1,3,1},
              {2,4,2},
              {3,2,3}}

二、Java实现二维数组与稀疏数组的转换

1.生成原始数组

前文示例已经给出。

2.生成稀疏数组

代码如下:

public static int[][] toSparseArr(int[][] arr) {
    // 遍历原数组得到非零元素个数num
    int num = 0;
    for (int[] row : arr) {
        for (int data : row) {
            if (data != 0) {
                num++;
            }
        }
    }

    // 创建稀疏数组sparseArr
    int[][] sparseArr = new int[num + 1][3];

    // 给稀疏数组sparseArr的第一行赋值
    sparseArr[0][0] = arr.length;
    sparseArr[0][1] = arr[0].length;
    sparseArr[0][2] = num;

    // 遍历二维数组,将非零的值存放到sparseArr中
    int count = 0; // count用于记录是第几个非零数据
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr[0].length; j++) {
            if (arr[i][j] != 0) {
                count++;
                sparseArr[count][0] = i;
                sparseArr[count][1] = j;
                sparseArr[count][2] = arr[i][j];
            }
        }
    }
    return sparseArr;
}

3.生成原始数组

代码如下:

public static int[][] toNormalArr(int[][] sparseArr) {
    // 读取稀疏数组的行列信息
    int row = sparseArr[0][0];
    int col = sparseArr[0][1];
    int num = sparseArr[0][2];

    // 创建原始二维数组
    int[][] normalArr = new int[row][col];

    // 根据稀疏数组的值,还原原始二维数组
    for (int i = 1; i <= num; i++) {
        int r = sparseArr[i][0];
        int c = sparseArr[i][1];
        int val = sparseArr[i][2];
        normalArr[r][c] = val;
    }

    return normalArr;
}

三、示例

1.将示例二维数组转换成稀疏数组

int[][] arr = {{0,0,0,0,0},
               {0,0,1,0,0},
               {0,0,0,2,0},
               {0,0,3,0,0},
               {0,0,0,0,0}};
int[][] sparseArr = toSparseArr(arr);

输出结果:

5 5 3
1 3 1
2 4 2
3 2 3

2.将示例稀疏数组还原成原始二维数组

int[][] sparseArr = {{5,5,3},
                     {1,3,1},
                     {2,4,2},
                     {3,2,3}};
int[][] normalArr = toNormalArr(sparseArr);

输出结果:

0 0 0 0 0
0 0 1 0 0
0 0 0 2 0
0 0 3 0 0
0 0 0 0 0

四、总结

本文介绍了Java实现二维数组与稀疏数组的转换过程,并给出了相关的示例代码。需要注意的是,稀疏数组的转换过程可以运用到实际项目中进行数据的压缩和存储。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构实现二维数组与稀疏数组转换详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Java线程的调度与优先级详解

    Java线程的调度与优先级详解 什么是线程调度? 线程调度是指操作系统按照一定的策略分配CPU时间给不同的线程,以实现多线程并发执行的机制。Java中的线程调度由操作系统和JVM共同参与。 线程优先级 在Java中,每个线程都有一个优先级,用来指定该线程在竞争CPU资源时的优先级,优先级越高,获取CPU资源的几率越大。Java中的线程优先级范围是1-10,默…

    other 2023年6月28日
    00
  • XAML: 自定义控件中事件处理的最佳实践方法

    下面是详细讲解“XAML: 自定义控件中事件处理的最佳实践方法”的完整攻略。 什么是自定义控件? 在 WPF 和 UWP 应用程序中,可以通过自定义控件来创建自己的特定控件。一个自定义控件可以由一个或多个现有控件组成,可以包含额外的属性和方法,以及自己特定的事件。XAML 是一种用于定义 WPF 和 UWP 界面的语言,可以用来创建自定义控件。 为什么需要自…

    other 2023年6月26日
    00
  • Android应用中使用Fragment组件的一些问题及解决方案总结

    Android应用中使用Fragment组件的一些问题及解决方案总结 Background Fragment是Android中的一个组件,与Activity类似,可以用于UI交互和视图管理。常见的使用场景是在大屏幕设备上,如平板电脑,可以将不同的功能区域以Fragment的形式分离开来,每个Fragment可以独立管理自己的生命周期和UI控件。 在实际的开发…

    other 2023年6月27日
    00
  • C语言宏定义结合全局变量的方法实现单片机串口透传模式

    c\\”, receivedData); // 清空全局变量 receivedData = ‘\\0’; } } } 在上述示例中,当接收到数据时,宏定义`STORE_DATA`会将数据存储到全局变量`receivedData`中。在主函数中,我们通过检查全局变量是否为空来判断是否有新数据接收,然后将接收到的数据打印到串口。 #### 示例2:将接收到的数据…

    other 2023年7月29日
    00
  • jQuery EasyUI API 中文文档 – EasyLoader 加载器

    jQuery EasyUI 是一个非常流行的前端 UI 框架,EasyLoader 加载器是其中的一个重要组件。下面我将为你提供关于 EasyLoader 加载器的完整攻略。 EasyLoader 加载器 EasyLoader 是 jQuery EasyUI 框架中的一个模块加载器,能够自动加载和管理 EasyUI 组件。 EasyLoader 支持自动按需…

    other 2023年6月25日
    00
  • angular.js指令中的controller、compile与link函数的不同之处

    AngularJS 是一个广泛使用的 MVC 框架,指令是用来扩充 HTML 标签的控制力度,使其可以执行自定义代码。在指令中,有三个重要的概念:controller、compile 和 link 函数,它们的作用和用法是不一样的。 Controller 函数 controller 函数是指令定义的一个选项,它可以用来指定当前指令所使用的控制器。控制器是一个…

    other 2023年6月27日
    00
  • GO语言的map类型实例详解

    GO语言的map类型实例详解 在GO语言中,map是一种非常常用的数据结构,它提供了一种键值对的映射,可以存储任意类型的值。本文将详细介绍GO语言中的map类型,包括创建map、向map中添加元素以及对map进行遍历等。 创建map 我们可以使用make函数来创建一个空的map。make函数的第一个参数为map的类型,第二个参数为map初始化的大小。如果不指…

    other 2023年6月27日
    00
  • Vue2.0 多 Tab切换组件的封装实例

    下面我将为您详细讲解“Vue2.0 多 Tab切换组件的封装实例”的完整攻略。 第一步:编写Tab组件的基本结构 首先,在编写多 Tab 切换组件之前,我们需要一些基本的结构,如: <template> <div class="tabs"> <div class="tabs-header"…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部