【Java.SE】数组的练习

news2024/11/18 8:29:20

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

在这里插入图片描述


数组的练习

  • 1. 数组转字符串
    • 1.1 自己实现一个tostring函数
  • 2. 数组拷贝
  • 3. 求数组中元素的平均值
  • 4. 查找数组中指定元素(顺序查找)
  • 5. 查找数组中指定元素(二分查找)
  • 6. 数组排序(冒泡排序)
  • 7. 数组逆序
  • 8. 二维数组

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.Arrays


public 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.Arrays


public 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 4
5 6 7 8
9 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】数组的练习,七七就先分享到这里了,如果你认为这篇文章对你有帮助,请给七七点个赞吧,如果发现什么问题,欢迎评论区留言!!💕💕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Servlet从入门到精通

概述&#xff1a; Servlet&#xff08;Server Applet&#xff09;是Java Server的简称&#xff0c;称为小服务程序或服务网连接器&#xff0c;用Java编写的服务器端服务&#xff0c;具有独立于平台和协议的特性&#xff0c;主要功能在于交互式的浏览和生成数据&#xff0c;生成…

【Linux】线程同步(互斥锁和读写锁)

概念 线程同步是指多个线程之间协调和管理彼此的执行顺序&#xff0c;以避免竞态条件和不确定的结果。线程同步的目的是确保共享资源的正确访问和保护临界区的完整性。 作用 避免竞态条件&#xff1a;当多个线程同时访问和修改共享资源时&#xff0c;可能会导致竞态条件的发生…

初创企业办公室租赁现状

概述&#xff1a; 随着创业生态的不断发展&#xff0c;越来越多的初创企业开始涌现。租赁办公室是初创企业成立和运营的必要条件之一&#xff0c;然而&#xff0c;由于各种原因&#xff0c;租赁办公室对于初创企业来说仍然存在一些挑战和难点。本文将探讨初创企业租赁办公室的…

功能测试的技术

目录 前言&#xff1a; 1) 基于最终用户/系统测试 2) 等价测试 3) 边界值测试 4) 基于决策的测试 5) 备用流量测试 6) 临时测试 前言&#xff1a; 功能测试是软件测试中最常见的一种测试类型&#xff0c;它旨在验证系统的功能是否符合设计要求和预期行为。在进行功能测…

a==1a==2a==3 与 a===1a===2a===3如何实现?

前言 首先&#xff0c;我们来看个demo let a {value: 1,toString() {// console.log("toString")return this.value;} }看一下输出结果&#xff1a; console.log(a 1 && a 2 && a 3) // falseconsole.log(a 1 && a 2 && a …

PHP 旅游信息管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 旅游信息管理系统 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为PHP APACHE&#xff0c;数据库 为mysql5.0&#xff0c;使用php语言开发。 …

nerf-studio初体验

前言 整个安装过程非常简单&#xff0c;运行得也很丝滑&#xff0c;最大的难点在于中文资料太少&#xff0c;英文看得头痛。本文也是参考了许多链接&#xff0c;有些链接比我写得详细多了&#xff0c;各位选择性看吧 安装 安装过程参考github链接&#xff0c;按顺序一步一步…

使用 ZBrush 和 Substance 3D中创建逼真的露西(p2)

今天瑞云渲染小编给带来了Rafael Benedicto 分享的 Lucy 项目背后工作流程&#xff0c;解释了头发是如何设置的&#xff0c;并回顾了在 Substance 3D Painter 中完成的纹理化过程。篇幅较长&#xff0c;分上下两篇来阐述幕后花絮。接下来接着讲述Lucy项目的纹理和渲染方面内容。…

PS 设置图片背景透明

找魔棒工具&#xff1a;编辑-工具栏。可设置w改为Z。&#xff08;方便使用&#xff09; 魔棒工具选择背景&#xff08;w&#xff09; 删除即可 如果我们导入的是“智能对象”&#xff0c;使用左侧的“矩形选区”删除框选区域的时候&#xff0c;就会弹出“无法完成请求&#…

pytorch量化库使用(1)

量化简介 量化是指以低于浮点精度的位宽执行计算和存储张量的技术。量化模型以降低的精度而不是全精度&#xff08;浮点&#xff09;值对张量执行部分或全部运算。这允许更紧凑的模型表示以及在许多硬件平台上使用高性能矢量化操作。与典型的 FP32 模型相比&#xff0c;PyTorc…

OnlyOffice7.3.2.8 和 7.3.3.40 Docker魔改版搭建教程

写在前面&#xff1a; 搭建项目所需环境只需查看此篇文档即可&#xff0c;中间有不清楚的地方评论即可&#xff0c;看到会回复&#xff01; ⼀ 、安装docker&#xff1a; 具体步骤请参照docker官网: https://docs.docker.com/get-docker/ 注&#xff1a; 不同操作系统安装方…

今天分享:配音软件哪个好

在数字化时代&#xff0c;视频内容的需求愈发增长。越来越多的人们创作和分享各种类型的视频&#xff0c;而其中一个重要的元素是声音。然而&#xff0c;有时候我们可能面临着一种情况&#xff1a;我们拍摄了一段令人惊艳的视频&#xff0c;但缺乏适合的配音或原声录音。这时&a…

人工智能时代,前端如何抓住机会

自从 2022 年底 OpenAI 推出了 ChatGPT3.5 后&#xff0c;GPT 的活跃用户数快速突破一亿&#xff0c;打破了互联网应用发展的历史记录。ChatGPT是一种基于人工智能技术的聊天机器人&#xff0c;它可以理解人类的自然语言&#xff0c;模拟人类的语言和思维方式&#xff0c;与人类…

介绍几款在线编程工具(Python)

阅读原文 有时候个人电脑不在身边&#xff0c;又需要处理一些工作&#xff0c;这时候可能需要在朋友的电脑或者公用电脑上操作数据。又或者要将自己写的代码以 notebook 的形式分享给 co-worker&#xff0c;这时就需要用到以下总结的几个直接在浏览器里进行 Python 编程的工具。…

怎么学习数据库连接与操作? - 易智编译EaseEditing

学习数据库连接与操作可以按照以下步骤进行&#xff1a; 理解数据库基础知识&#xff1a; 在学习数据库连接与操作之前&#xff0c;首先要了解数据库的基本概念、组成部分和工作原理。 学习关系型数据库和非关系型数据库的区别&#xff0c;了解常见的数据库管理系统&#xff…

为何及如何使用数据结构提升算法效率和问题解决能力?

数据结构是计算机科学中的一个重要概念&#xff0c;它是一种组织和存储数据的方式。数据结构提供了一种在计算机程序中有效地组织和操作数据的方法。 数据结构的主要目的是解决问题和优化算法。它们帮助我们在计算机内存中存储和组织数据&#xff0c;以便能够高效地访问和操作这…

Flink 自定义源算子之 读取MySQL

1、功能说明&#xff1a; 在Flink 自定义源算子中封装jdbc来读取MySQL中的数据 2、代码示例 Flink版本说明&#xff1a;flink_1.13.0、scala_2.12 自定义Source算子&#xff0c;这里我们继承RichParallelSourceFunction&#xff0c;因为要使用open方法来初始化数据库连接对…

Egg.js阿里JS后端框架,可以放心用。

目录 一、快速开始 二、尝试创建一个controll,修改路由&#xff0c;然后检查测试单元。 一、快速开始 npm install -g yarn yarn create egg --typesimple cd egg yarn install yarn devhttp://127.0.0.1:7001 二、尝试创建一个controll,修改路由&#xff0c;然后检查测试单…

PDF怎么转图片?PDF转图片的方法分享!​

PDF怎么转图片呢&#xff1f;相信很多人都会觉得PDF的非常的好用&#xff0c;小编也是被身边很多朋友推荐过后用了这个软件。但很多人在使用的时候有疑问&#xff0c;比如说PDF如何转图片&#xff1f;这难倒不少人&#xff0c;那么今天这篇文章就带你解析PDF怎么转图片&#xf…

LiangGaRy-学习笔记-Day25

1、Apache web相关 1.1、curl命令 作用&#xff1a;用来与服务器之间传输数据的工具 官网&#xff1a;https://curl.se支持很多种协议 语法&#xff1a;curl选项网址 选项&#xff1a; -A&#xff1a;设置代理给服务器-I&#xff08;大写i&#xff09;&#xff1a;输出返…