当前位置: 首页 > news >正文

Java数组操作

数组拓展

1.1 数组拷贝

需求:定义一个方法arraycopy, 从指定源数组中从指定的位置开始复制指定数量的元素到目标数组的指定位置。

1.2. 排序操作

需求:完成对int[] arr = new int[]{2,9,6,7,4,1}数组元素的升序排序操作.

1.2.1.冒泡排序

对未排序的各元素从头到尾依次比较相邻两个元素的大小关系,如果前一个元素大于后一个元素则交换位置,经过第一轮比较后可以得到最大值,同理第二轮比较后出现第二大值,以此类推,直到数组中数据有有序。

针对int[] arr = new int[]{ 2, 9, 6, 7, 4, 1 }数组元素做排序操作:

2轮比较:需要比较4次,比较完出现第二个大值。

3轮比较:需要比较3次,比较完出现第三个大值。

4轮比较:需要比较2次,比较完出现第四个大值。

5轮比较:需要比较1次,比较完出现第五个大值。

可以看出如有N个元素,则需要N-1轮比较,第M轮需要N-M次比较。

该数组有6个元素,只需要5轮比较。

交换数组中两个元素的方法

排序方法:

1.3 二分法查找

查找数组元素的算法:

 线性查找:从头找到尾,性能比较低。

 二分法查找(折半查找):前提数组元素是有序的,性能非常优异。

1.3.1 二分法搜索原理

猜数字游戏:电脑随机生成一个[ 1 , 100 ]之间的商品价格,等玩家来猜,猜之后,电脑提示出三种结果:你猜的数偏大,偏小和猜中了。

此时为了以最少次数猜中 ,玩家决定

先猜(1+100/ 2的商50,如果此时电脑提示猜的偏小了,那就能推断出该随机数在[ 51 , 100 ]之间,此时再猜(51+100/ 2的商75,如果电脑提示猜大了,那么该随机数必在[ 51 , 74 ]之间,那么继续猜(51+74/2的商,如此每次都可以排除剩下结果一半的可能性,直到猜到为止。

关键字:以最少的次数猜中,在规定的时间(10分钟)猜中最多。

代码如下:

1.4. 操作数组的API-Arrays

类似打印数组元素的这样的工具性的方法,其实SUN公司的攻城狮们早就写好代码了,并封装在了很多工具类中,我们把这种预先定义好的方法,称为API。对于我们而言,最基本的要求就是能调用这些方法,当然我们对自己有更高的要求,应该知其然,并知其所以然。

学习API一定要掌握一个秘诀:文档在手, 天下我有! 一定要经常性的查文档!!

Arrays工具类中的方法,一般都是使用static修饰的。

打开JDK帮助文档,搜索Arrays类,进入该类的文档页面,去找toString方法,发现在Arrays类中有多个toString方法,他们之间属于重载关系,分别用于打印不同类型的数组。

: 查看Arrays类中将int类型数组转换成字符串的toString方法。

如果看方法列表看不懂怎么使用,使用鼠标左键点击该方法名称,进入该方法的详细:

如果看不懂,就要静下心来多看几次,必须掌握每一部分到底在表达什么意思。

1.4.1. 打印数组元素

API中还有一个专门操作数组的工具类Arrays,该类提供了对数组元素的拷贝、元素搜索、元素排序、打印等功能方法,且该类为不同数据类型的数组都重载了相同功能的方法。

通过调用Arrays类中的toString方法完成打印数组元素的功能,掌握如何给类定义包、导入类以及看API文档。

1.4.2. 拷贝数组元素

Arrays 中提供了数组复制的方法,copyOf(int[] original, int newLength) 复制指定的数组,截取或者用0填充。

System类中提供了数组元素拷贝的方法,并且支持任意类型的数组拷贝,而不仅仅是int类型数组。

1.4.3. 数组元素排序

Arrays类中已经提供了数组排序的方法sort,并且是调优之后的,性能非常优异,在开发中只需要我们直接调用该方法即可即可。

1.4.4. 数组元素二分查找

Arrays类中已经提供了数组元素的二分查找。

小结:排序和二分法查找的原理需要掌握,当然, 在实际开发中, 会调用Arrays类中方法完成相关功能即可。

1.5 数组元素的增删改查操作

假设我现在是某个篮球队的教练,需要安排5个球员上场打球。此时需要模拟上场球员的存储,简单一点,我们就只存储上场球员的球衣号码。那么此时我需要以下几个操作:

1初始一个容量5的容器,用来存储场上的5个球衣号码。

2.安排5个球员上场,比如球员号码分别为1122334455

3查询指定索引位置球员的球衣号码是多少,如查询索引位置为2的球衣号码是33

4替换场上索引位置为2的球员,使用333号替换33号。

5罚下场上索引位置为2的球员(直接罚下,没有补位)。

6打印出场上球员的球衣号码,打印风格如 [1122334455]

思考1:用于什么存储上面的号码?,需不需要一个存储号码的容器?你想到谁?

思考2:试想给你一个数组 [11,22,33,44,55] , 会不会对数组容器中的元素进行加、除、修

思考3:试想我再给你一个数组 [10,20,30,40] 还需要你增删改查,刚才写的代码能复用吗?思考4:我们能不能对封装思维的理解进一步升华 ?

1.5.7 让容器支持存储任意数据类型的元素

此时元素类型是Integer类型,也就是只能存储整型的数据,但是却不能存储其他类型的数据,此时我们可以考虑吧元素类型改成Object,那么Object数组可以存储任意类型的数据。

import java.util.Arrays;public class MyArrayList {//存储元素容器private Object[] elementData = null;//记录元素个数private int size = 0;//自定义初始容量public MyArrayList(int initialCapacity) {if (initialCapacity < 0) {System.out.println("初始容量不能为负数");return;}this.elementData = new Object[initialCapacity];}//默认初始容量为10 public MyArrayList() {this(10);}//向容器中添加一个元素public void add(Object e) {//如果容器容量已满,此时需要扩容,此时扩容机制为原来容量的2倍 if (size == elementData.length) {this.elementData = Arrays.copyOf(this.elementData, size * 2);}//-----------------------------------------this.elementData[size] = e;size++;// 容器中元素数量加1}//查询指定位置的元素public Object get(int index) {
if (index < 0 || index >= size) {System.out.println("索引越界");return null;}return this.elementData[index];}//替换指定索引位置的元素public void set(int index, Object e) {if (index < 0 || index >= size) {System.out.println("索引越界");return;}this.elementData[index] = e;}//删除指定索引位置的元素public void remove(int index) {if (index < 0 || index >= size) {System.out.println("索引越界");return;}for (int i = index; i < size - 1; i++) {this.elementData[i] = this.elementData[i + 1];}this.elementData[size - 1] = null;size--;}public String toString() {if (elementData == null) {// 如果没有初始化容器 return "null";}if (size == 0) {// 如果容器中元素数量为0return "[]";}StringBuilder sb = new StringBuilder(40);sb.append("[");for (int index = 0; index < size; index++) { sb.append(this.elementData[index]);
//如果不是最后一个元素if (index != size - 1) {sb.append(",");} else {sb.append("]");}}return sb.toString();}}

注:此案例为了引出学习List的原理

相关文章:

Java数组操作

数组拓展 1.1 数组拷贝 需求&#xff1a;定义一个方法arraycopy, 从指定源数组中从指定的位置开始复制指定数量的元素到目标数组的指定位置。 1.2. 排序操作 需求&#xff1a;完成对int[] arr new int[]{2,9,6,7,4,1}数组元素的升序排序操作. 1.2.1.冒泡排序 对未排序的各元素…...

C++vector及其实现

第一个参数是类型(可以是自定义也可以是内置类型) 相当于生成一个该类型的数组 allocator是空间配置器 遍历 1.下标遍历 2.迭代器遍历 3.范围for 对象访问 有名对象访问 匿名对象访问 隐式类型转换 成员函数 sort 使用sort需要包含头文件algorithm eg. sort的使用非…...

路由策略实验1

先把地址全部配通 对R1 对R2 对R4 对R3 对R5 对R6 对R7 然后起路由协议 对R1 对R2 对R3 对R4 对R5 对R6 对R7...

含情脉脉的进程

冯诺依曼体系结构 一个计算机在工作的时候是怎样的呢&#xff1f; 我们所认识的计算机都是由一个个的硬件组件组成&#xff1a; 输入设备&#xff1a;键盘、鼠标、摄像头、话筒、磁盘、网卡 中央处理器&#xff08;CPU&#xff09;&#xff1a;运算器、控制器 输出设备&#x…...

重复文件怎么查找并清理?电脑重复文件清理工具分享:4个

在日常使用电脑的过程中&#xff0c;我们不可避免地会遇到各种重复文件的问题。这些重复文件不仅占据了宝贵的存储空间&#xff0c;还可能导致系统性能下降&#xff0c;甚至引发一些不必要的问题。因此&#xff0c;如何有效地查找并清理这些重复文件成为了许多用户关注的焦点。…...

Java中连接Mongodb进行操作

文章目录 1.引入Java驱动依赖2.快速开始2.1 先在monsh连接建立collection2.2 java中快速开始2.3 Insert a Document2.4 Update a Document2.5 Find a Document2.6 Delete a Document 1.引入Java驱动依赖 注意&#xff1a;启动服务的时候需要加ip绑定 需要引入依赖 <dependen…...

LabVIEW远程开发与调试

在现代项目开发中&#xff0c;远程开发与调试已经成为一种常见的模式&#xff0c;特别是在使用LabVIEW进行工程项目时。本文将详细分析LabVIEW远程开发与调试的优缺点&#xff0c;并从多个角度说明如何建议客户采用这种方式&#xff0c;以提高项目效率和质量。 优点 灵活性和便…...

C/C++|基于回调函数实现异步操作

首先&#xff0c;要搞懂一点&#xff0c;异步操作本质上也是并发&#xff0c;我们想要在线程级别实现异步并发基本就靠三种方式&#xff1a; 多线程并发回调函数协程 今天我们讨论的是回调函数&#xff0c;我们如何通过回调函数来实现异步操作呢&#xff1f; 非阻塞I/O操作回…...

Mac上搭建Python环境:深入探索与高效实践

Mac上搭建Python环境&#xff1a;深入探索与高效实践 在Mac上搭建Python环境&#xff0c;对于开发者来说是一个既具挑战性又充满乐趣的过程。本文将从四个方面、五个方面、六个方面和七个方面详细阐述如何在Mac上成功搭建Python环境&#xff0c;并帮助您更好地理解和应用Pytho…...

数据标准的制定落地

目录 什么是数据标准 基本定义 目的 数据标准体系分类 从内容层面分类 从管理视角分类 从面向的对象分类 从数据结构的角度分类 数据标准价值 业务价值 技术价值 管理价值 数据标准和数据治理的关系 数据标准在数据治理各项任务中的作用 数据标准与主数据 数据…...

微信小程序基础 -- 小程序UI组件(5)

小程序UI组件 1.小程序UI组件概述 开发文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/view/component.html 什么是组件&#xff1a; 组件是视图层的基本组成单元。 组件自带一些功能与微信风格一致的样式。 一个组件通常包括 开始标签 和 结…...

Linux shell编程学习笔记55:hostname命令——获取或设置主机名,显示IP地址和DNS、NIS

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。其中主机名也是我们要收集的信息之一。 1. hostname命令 的功能、格式和选项说明 我们可以使用命令 hostname --help 来查看hostname命令…...

【鸟哥】Linux笔记-硬件搭配

在Linux这个系统当中&#xff0c;几乎所有的硬件设备文件都在/dev这个目录内。打印机与软盘呢&#xff1f;分别是/dev/lp0, /dev/fd0。 几个常见的设备与其在Linux当中的文件名&#xff1a; 如果你的机器使用的是跟网际网络供应商 &#xff08;ISP&#xff09; 申请使用的云端…...

代码随想三刷数组篇

代码随想三刷数组篇1 704. 二分查找题目代码27. 移除元素题目代码977.有序数组的平方题目代码209.长度最小的子数组题目代码59.螺旋矩阵II题目代码704. 二分查找 题目...

windows环境下重建oracle监听

由于某种原因导致数据库监听启动失败&#xff0c;需要重新创建监听。 过程如下&#xff1a; 第一步&#xff1a;修改 listenr.ora 文件 &#xff0c;增加新的监听配置 LISTENER4 (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST DESKTOP-BE6GDNT)(PORT 152…...

单元测试框架Pytest的基本操作

Pytest基本操作 1. 详解1.1 命名规则:1.2 自定义查找规则:1.3 3种运行方式1.4 执行顺序2. 断言2.1 定义2.2 断言的规则3. mark3.1 mark的作用3.2 mark的标记方式3.3 注册标签名3.4 skip跳过标记4. pytest的参数化5. pytest的夹具(fixture测试夹具)5.1. 作用5.2. 夹具应用场…...

Java web应用性能分析之【java进程问题分析工具】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 前面大概讲了java进程问题分析流程&#xff0c;这里再小结一下分析工具&#xff0c;后面也会小结一下java进程问题分析定位。 1.分析工具 1.1.linux命令工具 参考&#xff1a;Java web应用性能分析之【Linux服务器性…...

02-2.3.2_2 单链表的查找

喜欢《数据结构》部分笔记的小伙伴可以订阅专栏&#xff0c;今后还会不断更新。 此外&#xff0c;《程序员必备技能》专栏和《程序员必备工具》专栏&#xff08;该专栏暂未开设&#xff09;日后会逐步更新&#xff0c;感兴趣的小伙伴可以点一下订阅、收藏、关注&#xff01; 谢…...

设计模式(十四)行为型模式---访问者模式(visitor)

文章目录 访问者模式简介分派的分类什么是双分派&#xff1f;结构UML图具体实现UML图代码实现 优缺点 访问者模式简介 访问者模式&#xff08;visitor pattern&#xff09;是封装一些作用于某种数据结构中的元素的操作&#xff0c;它可以在不改变这个数据结构&#xff08;实现…...

【Matplotlib作图-3.Ranking】50 Matplotlib Visualizations, Python实现,源码可复现

目录 03 Ranking 3.0 Prerequisite 3.1 有序条形图(Ordered Bar Chart) 3.2 棒棒糖图(Lollipop Chart) 3.3 点图(Dot Plot) 3.4 斜率图(Slope Chart) 3.5 杠铃图(Dumbbell Plot) References 03 Ranking 3.0 Prerequisite Setup.py # !pip install brewer2mpl import n…...

加入不正确的位置编码会破坏掉原本的信息吗?

会 位置编码的作用 在Transformer中&#xff0c;位置编码的主要作用是让模型感知输入序列中各个词的位置。因为Transformer完全依赖自注意力机制&#xff0c;它本身并没有序列信息&#xff0c;位置编码的引入就是为了补充这一点。 加法操作的合理性 位置编码通过加法操作与…...

区块链合约开发流程

区块链合约开发&#xff0c;尤其是以太坊智能合约开发&#xff0c;是一个多步骤的过程&#xff0c;从需求分析到部署和维护&#xff0c;每一步都需要仔细规划和执行。以下是详细的开发流程。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…...

建筑企业有闲置资质怎么办?

如果建筑企业拥有闲置资质&#xff0c;可以考虑以下几种方式来充分利用这些资质&#xff1a; 1. 租赁或转让资质&#xff1a; 将闲置的建筑资质租赁给其他企业或个人使用&#xff0c;或者通过转让的方式将资质出售给有需要的企业或个人。 2. 提供咨询服务&#xff1a; 利用建…...

Java开发-特殊文本文件,日志技术

目录 01.特殊文件,日志技术概述 02.特殊文件:Properties属性文件 ​编辑Properties案例 特殊文件:XML文件 XML的作用和应用场景 读取XML文件中的数据 XML的生成 约束XML文件的编写[了解] 日志技术 日志技术的体系 ​编辑 ​编辑 Logback日志框架的概述 Logback快…...

Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…...

无人机路径规划:基于鸽群优化算法PIO的无人机三维路径规划MATLAB代码

一、无人机模型介绍 无人机三维航迹规划_无人机航迹规划-CSDN博客 二、部分代码 close all clear clc warning (off) global model global gca1 gca2 gca3 gca4 model CreateModel(); % Create search map and parameters load(BestPosition5.mat); load(ConvergenceCurve5…...

ArcGIS属性域和子类型

01 属性域 道路的车道数值是小于10的。在编辑道路的此属性时&#xff0c;为了限制其值在10以内&#xff0c;可以使用属性域。当输入数据超过10时&#xff0c;就会限制输入。 限制输入这个功能是Pro特有的&#xff0c;在ArcMap中输入超出限制的值也是合法的&#xff0c;需要手动…...

电子电器架构 --- 什么是域控制器?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...

链表头部插入结点

Linked List Inserting a node at beginning #include<stdlib.h>//为了用malloc #include<stdio.h> struct node {int data;struct node* next;//在cpp中可以只写 Node *Link&#xff1b;//为了表意明确&#xff0c;Link也经常被命名为next }; struct node* head…...

k8s集群修改apiserver的ip地址

有时候由于服务器的调整&#xff0c;导致ip的的变化&#xff0c;k8s集群的api大管家的ip变动会导致kubectl的接口都无法正常使用&#xff0c;这是只需要将k8s主节点配置文件的ip替换即可。 例如无需要将原来的192.168.146.202的ip替换成192.168.85.202&#xff0c;执行一下操作…...