IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> java中数组及稀疏数组 -> 正文阅读

[数据结构与算法]java中数组及稀疏数组

数组的使用

  • 普通for循环
  • For-Each循环(一般用来打印一些返回值)
  • 数组作方法入参
  • 数组作返回值
  • 数组的基本使用代码如下:
package www.array;

public class addayDemo04 {
    public static void main(String[] args) {
        int[] arrays={1,2,3,4,5};

        //jdk1.5,没有下标 foreach循环
        for (int array : arrays) {
            System.out.println(array);
        }
        //打印数组元素
        printArray(arrays);

        //反转的操作
        int[] reverse = reverse(arrays);
        printArray(reverse);
    }


    //打印数组元素
    public static void printArray(int[] arrays){
        for (int i = 0; i <arrays.length ; i++) {
            System.out.print(arrays[i]+" ");
        }
    }
    //反转数组
    public static int[] reverse(int[] arrays){
        int[] result = new int[arrays.length];

        //反转的操作
        for (int i = 0,j=result.length-1; i <arrays.length ; i++,j--) {
            result[j]=arrays[i];
        }
        return result;
    }
}

多维数组

  • 多维数组可言看出是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组
  • 二维数组
int a[][] =new int[2][5]
  • 解析:意思二维数组a可以看出一个两行五列的数组
  • 简单运用代码如下:
package www.array;

public class arrayDemo04 {
    public static void main(String[] args) {
        /*
        二维数组下标对应的数据
        二维数组就是把一维数组里面放的数据变成数组
          array[0] 1,2
          array[1] 2,3
          array[2] 3,4
          array[3] 4,5
         */
        int[] arrays={1,2,3,4,5}; //一维数组
        int[][] array={{1,2},{2,3},{3,4},{4,5}};//二维数组

        System.out.println(array[0][0]);//输出1
        System.out.println(array[0][1]);//输出2
        print(array[1]);//输出2,3

        for (int i = 0; i <array.length ; i++) { //第一遍循环为最外层的下标
            for (int j = 0; j <array[i].length ; j++) { //第二遍循环为内部的下标
                System.out.print(array[i][j]+" "); //输出:1 2 2 3 3 4 4 5 
            }
        }

    }
    //for循环输出
    public static void print(int[] array){
        for (int i = 0; i <array.length ; i++) {
            System.out.println(array[i]);
        }
    }
}

数组的扩展

Arrays类

  • 数组的工具类java.util.Arrays

  • 由于数组对象本身并没有什么方法可以供我们调用,但ApI中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作

  • 查看JDK帮助文档

  • Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接十一月类名进行调用,而不用使用对象来调用(注意:是不用 而不是 不能)

  • 具有一下常用功能:

  • 给数组赋值:通过fill方法

  • 对数组排序:通过sort方法,按升序

  • 比较数组:通过equals方法,方法比较数组中元素的值是否相等

  • 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查询

  • 简单运用代码如下

package www.array;

import java.util.Arrays;

public class ArrayDemo05 {
    public static void main(String[] args) {
        int[] a={1,2,6,4,3,80,55,525,24};
        int[] b={1,2,6,4,3,80,55,525,20};

        //使用Arrays工具类比较两个数组是否相等
        if(Arrays.equals(a,b)){
            System.out.println("相等");
        }
            System.out.println("不相等"); //结果为不相等

        //使用Arrays工具类打印数组:toString
        System.out.println(Arrays.toString(a));

        //使用Arrays工具类排序sort:升序
        Arrays.sort(a);
        System.out.println(Arrays.toString(a)); //先排序后打印

        //选择填充
       Arrays.fill(a,3,6,0);//选择填充 将第三位后第6位为止全部填充为0
       
        System.out.println(Arrays.toString(a));

        //数组填充
        Arrays.fill(a,0); //全部填充为0
        System.out.println(Arrays.toString(a));

    }
}

冒泡排序

  • 冒泡排序无疑是最为出名的排序算法之一,总共有八大排序
  • 冒泡排序的代码还是相当简单的,两层循环,外层冒泡轮数,里程依次比较
  • 我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为O(n2).
  • 代码实现如下:
package www.array;

import java.util.Arrays;

public class ArrayDemo06 {
    public static void main(String[] args) {
        int[] a={2,3,45,63,535,45,46,6,636,6346};
        int[] sort = sort(a);//调用自己编写的方法以后,返回一个排序后的数组
        System.out.println(Arrays.toString(a));
    }

        //1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置
        //2.每一次比较,都会产生出一个最大,或者最小的数字
        //3.下一轮则可以少一次排序
        //4.依次循环,直到结束

        public static int[] sort(int[] array){
        //临时变量
           int temp=0;

           //外层循环,判断我们这个要循环多少次
            for (int i = 0; i < array.length; i++) {
           //内存循环,比较判断两个数,如果第一个比第二个数大,则交换位置
                for (int j = 0; j <array.length-1-i ; j++) {
                    if(array[j+1]<array[j]){
                        temp=array[j]; //把array[j]放到定义的临时变量temp中去,这样子array[j]就为空了
                        array[j]=array[j+1];//把array[j+1]放入到array[j]中去,这样子array[j+1]就为空了
                        array[j+1]=temp;//最后在把临时变量temp中的值赋值给 array[j+1]
                    }
                }
            }
            return array;
        }

}

java中数据交换位置的方法

  • 首先定义一个变量为零,用来接收数据
  • 将第一个数据中的值放入变量中,则第一个数据中的值为空
  • 将第二个数据中的值放入第一个数据中,则第一个数据的值为第二个数据的,第二个数据的值为空
  • 将变量中的数据放入第二个数据中去,则第二个数据中的变量为第一个数据的值
  • 代码如下:
package www.array;

public class ArrayDemo07 {
    public static void main(String[] args) {
        //第一个数据
        int i=10;
        //第二个数据
        int b=20;
        //临时变量
        int numbs=0;
        //将第一个数据的值放入变量中
        numbs =i;
        //将第二个数据的值放入第一个数据中
         i=b;
        //将临时变量中的值放入第二个数据中从而实现交换
        b=numbs;

        System.out.println(i);//10
        System.out.println(b);//20

    }
}

稀疏数组

  • 需求:编写五子棋游戏中,有存盘和退出和续上盘的功能
  • 分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据
  • 解决:稀疏数组

稀疏数组介绍

  • 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
  • 稀疏数组的处理方式是:
  • 记录数组一共有几行几列,有多少个不同值
  • 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
  • 代码实现编写五子棋游戏中,有存盘和退出和续上盘的功能如下
package www.array;

public class arrayDemo08 {
    public static void main(String[] args) {
        //1.创建一个二维数组 11*11  0:没有棋子, 1:黑棋  2:白棋
        int[][] array1=new int[11][11];
        array1[1][2]=1;
        array1[2][3]=2;
        System.out.println("输出原始的数组");

        //遍历二维数组
        //一维数组只需要forEach遍历一次
        //但是因为二维数组是一维数组里面存一维数组则需要遍历两次
        //二维数组是由一维数组存储的数字变为数组
        for (int[] ints : array1) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
        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++;        //如果获取的下标对应的值不为0则记录一个有效数组
                }
            }
        }
        System.out.println("有效值的个数"+sum);

        //2.创建一个稀疏数组的数组
        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[i].length ; j++) {
                if(array1[i][j]!=0){ //如果对应下标的值不为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("还原");

        //1.读取稀疏数组           此处为上面稀疏数组存入值的下标
        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 : array3) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }
}

代码实现效果如下图:
在这里插入图片描述
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:41:41  更:2021-12-04 13:41:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 23:42:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码