返回顶部
首页 > 资讯 > 后端开发 > JAVA >【Java.SE】数组的练习
  • 357
分享到

【Java.SE】数组的练习

java开发语言junit后端 2023-08-17 22:08:00 357人浏览 薄情痞子
摘要

作者简介: 辭七七,目前大一,正在学习C/C++,Java,python等 作者主页: 七七的个人主页 文章收录专栏:Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用,数组的使用,类和对象,继承和多态,抽象类和接口等内容

作者简介: 辭七七,目前大一,正在学习C/C++,Java,python
作者主页: 七七的个人主页
文章收录专栏Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用,数组的使用,类和对象,继承和多态,抽象类和接口等内容
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

在这里插入图片描述


1. 数组转字符串

数组转字符串我们需要借助工具类

代码示例

import java.util.Arrays  //Java中的包 public class TestDemo {    public static int[] func() {        return new int[]{1,2,3,4,5,6};    }    public static void main(String[] args) {        int[] ret = func();        //这个方法主要将参数的数组转化为字符串输出       String s = Arrays.toString(ret);        //Ctrl+鼠标点击,可以跳转到这个方法的原码                System.out.println(s);    }}//执行结果[1, 2, 3, 4, 5, 6]

使用这个方法后续打印数组就更方便一些.
Java 中提供了 java.util.Arrays 包,其中包含了一些操作数组的常用方法。

我们可以在jdk里搜索一下Arrays的用法,如图所示:
在这里插入图片描述

1.1 自己实现一个tostring函数

定义一个myToString的方法,利用for循环和if判断来解决问题
代码示例:

public class TestDemo {    public static String myToString(int[] array){        String ret = "[";        for (int i = 0; i < array.length; i++) {            ret += array[i];           if (i != array.length -1){               ret += ",";           }        }        ret += "]";        return ret;    }    public static void main(String[] args) {        int[] array = {1,2,3,4,5};        String ret = myToString(array);        System.out.println(ret);    }}

打印结果:
在这里插入图片描述

2. 数组拷贝

先来看一个简单的数组拷贝:
使用for循环来完成的拷贝

public class TestDemo {    public static void main(String[] args) {        int[] array = {1,2,3,4,5};        int[] copy = new int[array.length];        for (int i = 0; i < array.length; i++) {            copy[i] = array[i];        }        System.out.println(Arrays.toString(copy));    }}

打印结果:
在这里插入图片描述
以下代码是不是拷贝
在这里插入图片描述

答案:不是

在上述代码中我们可以通过修改形参的值来改变实参

// array3和array2引用的是同一个数组  // 因此array3修改空间中内容之后,array2也可以看到修改的结果  int[] array2 = {1,2,3,4,5};  int[] array3 = array2;  array3[0] = 10;  System.out.println("newArr: " + Arrays.toString(array2));

我们可以不用for循环来拷贝数组,直接用Arrays中的copyof方法来完成

import java.util.Arrayspublic class TestDemo {    public static void main(String[] args) {        int[] array = {1,2,3,4,5};        int[] copy = Arrays.copyOf(array,array.length);        System.out.println(Arrays.toString(copy));            }}

//使用Arrays中copyOf方法完成数组的拷贝:
// copyOf方法在进行数组拷贝时,创建了一个新的数组
// array和copy引用的不是同一个数组

数组的扩容:array.length后 *2 就是扩大两倍
代码示例:

import java.util.Arrayspublic class TestDemo {    public static void main(String[] args) {        int[] array = {1,2,3,4,5};        int[] copy = Arrays.copyOf(array,array.length*2);        System.out.println(Arrays.toString(copy));    }}

运行结果:
在这里插入图片描述
拷贝某个范围
代码示例

public class TestDemo {    public static void main(String[] args) {        int[] array = {1,2,3,4,5};        //取下标为1到3的数字        int[] copy = Arrays.copyOfRange(array,1,3);        System.out.println(Arrays.toString(copy));    }}

运行结果:
在这里插入图片描述

如果下标范围过大,则能拷贝多少拷贝多少,其余位置用0补全

画图对比看一下拷贝和指向的区别

在这里插入图片描述
在这里插入图片描述

注意: 数组当中存储的是基本类型数据时,不论怎么拷贝基本都不会出现什么问题,但如果存储的是引用数据类型,拷贝时需要考虑深浅拷贝的问题,关于深浅拷贝在后续详细给大家介绍。

crtl+鼠标左键,单击copyOfRange来查看他的原码看一下他是怎么运行的
在这里插入图片描述
在这里crtl+鼠标左键,单击arraycopy,来看一下他是怎么实现的
可以看到他的参数如下图所示:
在这里插入图片描述
按照以上参数用自己代码实现如下:

public class TestDemo {    public static void main(String[] args) {        int[] array = {1,2,3,4,5};        int[] copy = new int[array.length];        System.arraycopy(array,0,copy,0,array.length);        System.out.println(Arrays.toString(copy));    }}

3. 求数组中元素的平均值

给定一个整型数组, 求平均值
代码示例:

public static void main(String[] args) {   int[] arr = {1,2,3,4,5,6};   System.out.println(avg(arr));}public static double avg(int[] arr) {   int sum = 0;   for (int x : arr) {     sum += x;   }   return (double)sum / (double)arr.length;   //需要强转成double型}  // 执行结果  3.5

4. 查找数组中指定元素(顺序查找)

给定一个数组, 再给定一个元素, 找出该元素在数组中的位置.
代码示例:

public static void main(String[] args) {   int[] arr = {1,2,3,10,5,6};   System.out.println(find(arr, 10));}public static int find(int[] arr, int data) {   for (int i = 0; i < arr.length; i++) {     if (arr[i] == data) {       return i;//找到返回下标     }   }   return -1; // 表示没有找到}// 执行结果3

5. 查找数组中指定元素(二分查找)

针对有序数,可以使用更高效的二分查找。

什么叫有序数组?
有序分为 “升序” 和 “降序”
如 1 2 3 4 ,依次递增即为升序。
如 4 3 2 1 ,依次递减即为降序。

如果数组为无序数组,可以用 Arrays.sort(array)这个方法对其进行排序
代码所示:

public class TestDemo {    public static void main(String[] args) {        int[] array = {1,3,2,6,4,5};        Arrays.sort(array);        System.out.println(Arrays.toString(array));    }}

打印结果:
在这里插入图片描述

以升序数组为例,二分查找的思路是先取中间位置的元素,然后使用待查找元素与数组中间元素进行比较:

  • 如果相等,即找到了返回该元素在数组中的下标
  • 如果小于,以类似方式到数组左半侧查找
  • 如果大于,以类似方式到数组右半侧查找

画图理解
当我们想找的是4时
在这里插入图片描述

代码示例:

public static void main(String[] args) {   int[] arr = {1,2,3,4,5,6};   System.out.println(binarySearch(arr, 6));}public static int binarySearch(int[] arr, int toFind) {   int left = 0;   int right = arr.length - 1;   while (left <= right) {     int mid = (left + right) / 2;     if (toFind < arr[mid]) {       // 去左侧区间找       right = mid - 1;     } else if (toFind > arr[mid]) {       // 去右侧区间找l      eft = mid + 1;     } else {       // 相等, 说明找到了       return mid;     }   }   // 循环结束, 说明没找到   return -1;}// 执行结果5

可以看到,针对一个长度为 10000 个元素的数组查找,二分查找只需要循环 14 次就能完成查找。随着数组元素个数越多,二分的优势就越大。

我们也可以直接调用Java中的binarySearch方法来直接找下标
代码演示:

public class TestDemo {    public static void main(String[] args) {        int[] array = {1,3,2,6,4,5};        Arrays.sort(array);        System.out.println(Arrays.binarySearch(array,5));    }}

运行结果:
在这里插入图片描述
扩展:Java中的Attays方法
在这里插入图片描述
例如:比较两个数组两个对应位置数字的大小是否相等用Arrays.equals()的方法
代码演示:

 public static void main(String[] args) {        int[] array1 = {1,2,3,4,5};        int[] array2 = {1,2,3,4,5};        boolean flg = Arrays.equals(array1,array2);        System.out.println(flg);    }

结果为
在这里插入图片描述
填充一个数组时用Arrays.fill()的方法
代码演示:

public static void main(String[] args) {        int[] array3 = new int[10];        Arrays.fill(array3,-1);        System.out.println(Arrays.toString(array3));    }

打印结果为:
在这里插入图片描述
也可选择填充位置 Arrays.fill(array3,1,4,-1);,把括号里边改成1~4下标的数字,填充为-1

6. 数组排序(冒泡排序)

给定一个数组, 让数组升序 (降序) 排序。
假设排升序:

  1. 将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾
  2. 依次从上述过程执行,直到数组中所有的元素都排列好

我们来看一下4,8,9,3,6的排序图
在这里插入图片描述

代码示例:

public class TestDemo {    public static void bubbleSort(int[] array) {        //i代表的是趟数!!        for (int i = 0; i < array.length-1; i++) {            //j代表每一趟比较的次数            boolean flg = false;            for (int j = 0; j < array.length-1-i; j++) {                if(array[j] > array[j+1]) {                    int tmp = array[j];                    array[j] = array[j+1];                    array[j+1] = tmp;                    flg = true;                }            }            if(flg == false) {                break;//说明有序了!!!            }        }    }    public static void main(String[] args) {        int[] arr = {9, 5, 2, 7};        bubbleSort(arr);        System.out.println(Arrays.toString(arr));    }}//运行结果[2, 5, 7, 9]

冒泡排序性能较低。Java 中内置了更高效的排序算法

public static void main(String[] args) {   int[] arr = {9, 5, 2, 7};   Arrays.sort(array);   System.out.println(Arrays.toString(array));}

关于 Arrays.sort 的具体实现算法, 我们在后面的排序算法课上再详细介绍. 到时候我们会介绍很多种常见排序算法.

7. 数组逆序

给定一个数组,将里面的元素逆序排列。
思路
设定两个下标,分别指向第一个元素和最后一个元素,交换两个位置的元素,然后让前一个下标自增,后一个下标自减,循环继续即可。
代码示例:

public static void main(String[] args) {   int[] arr = {1, 2, 3, 4};   reverse(arr);   System.out.println(Arrays.toString(arr));}public static void reverse(int[] arr) {   int left = 0;   int right = arr.length - 1;   while (left < right) {     int tmp = arr[left];     arr[left] = arr[right];     arr[right] = tmp;     left++;     right--;   }}

运行结果:
在这里插入图片描述

库里边没有方法可以直接数组逆序

8. 二维数组

二维数组本质上也就是一维数组,只不过每个元素又是一个一维数组。
基本语法

数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };
初始化示例:

int[][] arr = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};int[][] arr1 = new int[][]{{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};int[][] arr2 = new int[2][3]

通过array[行][列]的坐标来访问某一个值
图解:
在这里插入图片描述

代码示例:

int[][] arr = {   {1, 2, 3, 4},   {5, 6, 7, 8},   {9, 10, 11, 12}};for (int i = 0; i < arr.length; i++) {   for (int j = 0; j < arr[i].length; j++) {     System.out.printf("%d\t", arr[i][j]);   }   System.out.println("");}// 执行结果1 2 3 45 6 7 89 10 11 12

二维数组的用法和一维数组并没有明显差别,因此我们不再赘述。
同理,还存在 “三维数组”,“四维数组” 等更复杂的数组,只不过出现频率都很低。

我们如果想直接打印二维数组要用什么呢?
我们知道一维数组的打印用Arrays.toString(),但是用它打印二维数组打印的是数组的地址
所以我们要用Arrays.deepToString()的方法直接打印二维数组
代码演示:

int[][] arr = {       {1, 2, 3, 4},       {5, 6, 7, 8},       {9, 10, 11, 12}};  System.out.println(Arrays.deepToString(arr));

在这里插入图片描述
不规则的二维数组
代码演示:

public static void main(String[] args) {        int[][] array = new int[2][];        array[0] = new int[]{1,2,3};        array[1] = new int[]{4,5,6,7,8,9};        System.out.println(Arrays.deepToString(array));    }//运行结果[[1, 2, 3], [4, 5, 6, 7, 8, 9]]

可以指定二维数组的长度,这时可以省略他的列
画图解释:
在这里插入图片描述

关于【Java.SE】数组的练习,七七就先分享到这里了,如果你认为这篇文章对你有帮助,请给七七点个赞吧,如果发现什么问题,欢迎评论区留言!!💕💕

来源地址:https://blog.csdn.net/2201_75366661/article/details/131154599

--结束END--

本文标题: 【Java.SE】数组的练习

本文链接: https://lsjlt.com/news/373372.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【Java.SE】数组的练习
    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏:Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用,数组的使用,类和对象,继承和多态,抽象类和接口等内容 ...
    99+
    2023-08-17
    java 开发语言 junit 后端
  • 【JAVA】数组练习
    ⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 数组练习 1. 数组转...
    99+
    2023-08-17
    java 开发语言
  • 【Java.SE】数组的定义与使用
    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏:Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用,数组的使用,类和对象,继承和多态,抽象类和接口等内容 ...
    99+
    2023-08-16
    java 数据结构 开发语言
  • C++实现LeetCode数组练习题
    目录1、存在重复元素2、最大子序和3、两数之和4、合并两个有序数组5、两个数组的交集II6、买卖股票的最佳时机7、杨辉三角8、重塑矩阵9、有效的数独10、矩阵置零总结1、存在重复元素...
    99+
    2024-04-02
  • Python划分数组为连续数字集合的练习
    目录1、问题描述2、解决方案3、结语本文转自微信公众号:"算法与编程之美" 1、问题描述 给你一个整数数组 nums 和一个正整数 k,请你判断是否可以把这个数组划分成一些由 k 个...
    99+
    2024-04-02
  • C语言算法练习之数组求素数
    目录一、问题描述二、算法实例编译环境三、算法实例实现过程3.1、包含头文件3.2、声明数组3.3、声明相关变量3.4、数组赋值3.5、 输出数组里面元素的值3.6、求素数、素数和、最...
    99+
    2024-04-02
  • C语言练习之数组中素数交换
    目录题目要求总结题目要求 (1)在主函数中创建数组num,使用测试数据{108 4 19 7 23 66 49 13 33 35}对其初始化; (2)定义change函数,将num数...
    99+
    2024-04-02
  • LeetCode 算法练习:PHP 与 Git 中的数组操作技巧
    数组是 PHP 中最常用的数据类型之一,也是 Git 中常用的数据结构之一。在 LeetCode 算法练习中,数组的应用非常广泛,因此掌握数组的操作技巧对于算法练习非常重要。本文将介绍一些 PHP 和 Git 中常用的数组操作技巧,帮助读...
    99+
    2023-08-15
    leetcode 数组 git
  • C语言算法练习之数组元素排序
    目录一、问题描述二、算法实例编译环境三、算法实例实现过程3.1、包含头文件3.2、定义宏和声明数组3.3、声明相关变量3.4、随机生成十个数字赋值给数组3.5、输出随机生成的十个数字...
    99+
    2024-04-02
  • 习题22:更多的练习
    练习代码如下# coding: utf-8 __author__ = 'www.py3study.com' print("Let's practice&nb...
    99+
    2023-01-30
    习题 更多
  • Python数据库编程练习 ※
    第1关:数据库表创建※ 任务描述 本关任务:编写一个 python 程序完成数据库建表操作。 相关知识 pymysql 模块介绍 pymysql 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2 中是使用...
    99+
    2023-09-11
    数据库 python mysql
  • Python:函数篇(每周练习)
    编程题: Python第四章作业(初级) (educoder.net) 题一:无参无返回值函数 def print_hi_human(): # 函数名用小写字母 print("人类,你好!")if __name__ == '__...
    99+
    2023-10-25
    python 开发语言 笔记 深度学习 学习方法
  • PHP数组在Laravel中的应用:LeetCode编程练习必备技巧
    在Laravel开发中,PHP数组是一个非常重要的数据结构,它可以在很多场景下帮助我们轻松地处理数据。特别是在LeetCode编程练习中,PHP数组更是必不可少的工具之一。本文将介绍PHP数组在Laravel中的应用,并提供一些LeetC...
    99+
    2023-08-14
    laravel 数组 leetcode
  • Java算法中数组与字符串练习题有哪些
    这篇文章主要介绍Java算法中数组与字符串练习题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!题目一解法class Solution {    pub...
    99+
    2023-06-29
  • C语言新手练习之多维数组、结构体及函数
    1887 颜色精简 题目: 有一个颜色集合,里面有若干个颜色值(RBG系统表示)。现在有若干个颜色值需要映射到集合中的某个值。具体的映射方法是找到集合中和它的颜色距离最小的进行映射。...
    99+
    2024-04-02
  • sed和awk的练习
    使用sed打印出IP地址: [root@Srv02 ~]# ifconfig eth0 |grep Mask|sed 's/^.*dr://g'|sed 's/Bc.*$//g' 192.168.1...
    99+
    2024-04-02
  • Python中def()函数的实战练习题
    目录一、判断以下哪些不能作为标识符 A、aB、¥aC、_12D、$a@12E、falseF、False 答案为:(F、D、B、E) 二、输入数,判断这个数是否是质数(要求使用函数 +...
    99+
    2024-04-02
  • python-练习实现猜数字的循环
    目录:input:输入print:输出int:整数型if循环:如果elif:或者else:否则break:结束本次循环python语言是从上到下一句一句执行的。代码部分:#!/usr/bin/env python # -*- coding:...
    99+
    2023-01-31
    数字 python
  • python函数的重新定义及练习
    目录python函数一、函数定义二、自定义函数1、自定义函数规则:2、一般形式三、函数调用四、参数正式参数类型:五、变量作用域六、函数的递归调用python的文件操作课后作业习题1:...
    99+
    2024-04-02
  • C语言算法练习之求二维数组最值问题
    目录一、问题描述二、算法实例编译环境三、算法实例实现过程3.1、包含头文件3.2、定义宏和声明数组3.3、声明相关变量3.4、输入数组(方阵)的阶3.5、输出 “输入的数...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作