Java学习笔记(五)——数组、排序和查找

news2024/11/18 19:59:45

一、数组

数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。即数组就是一组数据。

(一)数组的使用

1、使用方式1——动态初始化

(1)数组的定义:     数据类型 数组名[] = new 数据类型[大小]

                          或      数据类型[] 数组名 = new 数据类型[大小]

                                    int a[] = new int[5]; 

(2)数组的引用(使用):数组名[下标/索引/index]

import java.util.Scanner;
public class Array02{

	public static void main(String[] args){
		
		Scanner myScanner = new Scanner(System.in);
		double scores[] = new double[5];
		for(int i = 0; i < scores.length; i++){
			System.out.print("请输入第" + (i + 1) + "个元素的值:");
			scores[i] = myScanner.nextDouble();
		}
		System.out.println("当前数组的值如下:");
		for(int i = 0; i < scores.length; i++){
			System.out.print(scores[i] + " ");
		}
	}
}

2、使用方式2——动态初始化

(1)先声明数组:  数据类型 数组名[];  或  数据类型[] 数组名;

                                int a[];

(2)创建数组:   数组名 = new 数据类型[大小];

                               a = new int[10];

import java.util.Scanner;
public class Array03{

	public static void main(String[] args){
		
		Scanner myScanner = new Scanner(System.in);
		double scores[]; //声明数组,这时scores是null
		scores = new double[5]; // 分配内存空间,可以存放数据
		for(int i = 0; i < scores.length; i++){
			System.out.print("请输入第" + (i + 1) + "个元素的值:");
			scores[i] = myScanner.nextDouble();
		}
		System.out.println("当前数组的值如下:");
		for(int i = 0; i < scores.length; i++){
			System.out.print(scores[i] + " ");
		}
	}
}

3、使用方式3——静态初始化

(1)初始化数组:    数据类型 数组名[] = {元素值,元素值...}

                                    int a[] = {2,5,6,7,8,89,90,34,56}

       上面的用法相当于:int a[] = new int[9];

                    a[0] = 2; a[1] = 5; a[2] = 6; a[3] = 7; a[4] = 8; a[5] = 89; a[6] = 90; a[7] = 34; a[8] = 56;


public class Array01{

	public static void main(String[] args){
		
		double hens[] = {3, 5, 1, 3.4, 2, 50};
		double sum = 0;
		for(int i = 0; i < hens.length; i++){
			sum += hens[i];
		}
		System.out.println("sum=" + sum + ",avg=" + sum/hens.length);
	}
}

(二)数组使用注意事项和细节

1、数组是多个相同类型数据的组合,实现对这些数据的统一管理。

2、数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。

3、数组创建后,如果没有赋值,有默认值。int 0,short 0,byte 0,long 0,float 0.0,double 0.0,

char \u0000,boolean false,String null

4、使用数组的步骤:(1)声明数组并开辟空间 (2)给数组各个元素赋值 (3)使用数组

5、数组的下标是从0开始的。

6、数组下标必须在指定范围内使用,否则报下标越界异常,比如int arr[] = new int[5];的有效下标为0-4。

7、数组属于引用类型,数组型数据是对象(object)

(三)数组赋值机制

1、基本数据类型赋值,这个值就是具体的数据,而且相互不影响。(值传递/值拷贝

2、数组在默认情况下是引用传递,赋的值是地址。

public class Array06{

	public static void main(String[] args){

		int arr1[] = {1,2,3,4,5};
		int arr2[] = arr1;
		arr2[0] = 10;

		for(int i = 0; i < arr1.length; i++){
			System.out.print(arr1[i] + " ");
		}
	}
}

 

(四)数组拷贝

将arr1拷贝到arr2,要求数据空间是独立的。

public class Array07{

	public static void main(String[] args){

		int arr1[] = {1,2,3};
		// 开辟一个和arr1一样大的数组
		int arr2[] = new int[arr1.length];
		for(int i = 0; i < arr1.length; i++){
			arr2[i] = arr1[i];
		}
		// 修改arr2[0]
		arr2[0] = 10;
		// 修改arr2不会影响arr1
		System.out.print("arr1的元素为:");
		for(int i = 0; i < arr1.length; i++){
			System.out.print(arr1[i] + " ");
		}
		System.out.println();
		System.out.print("arr2的元素为:");
		for(int i = 0; i < arr2.length; i++){
			System.out.print(arr2[i] + " ");
		}
	}
}

(五)数组反转

public class Array08{

	public static void main(String[] args){

		int arr[] = {1,2,3,4,5};
		int temp = 0;
		int len = arr.length;
		for(int i = 0; i < len/2; i++){
			temp = arr[i];
			arr[i] = arr[len - 1 - i];
			arr[len - 1 - i] = temp;
		}
		for(int i = 0; i < len; i++){
			System.out.print(arr[i] + " ");
		}
	}
}

(六)数组扩容

要求:动态地给数组添加元素效果,实现对数组扩容。

(1)原始数组使用静态分配 int arr[] = {1,2,3};

(2)增加元素4,直接放在数组的最后

(3)用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n

public class Array09{

	public static void main(String[] args){

		int arr[] = {1,2,3};
		int arrNew[] = new int[arr.length + 1];
		for(int i = 0; i < arr.length; i++){
			arrNew[i] = arr[i];
		}
		arrNew[arrNew.length - 1] = 4;
		arr = arrNew;
		System.out.print("arr数组的元素为:");
		for(int i = 0; i < arr.length; i++){
			System.out.print(arr[i] + " ");
		}
	}
}

// 数组扩容
import java.util.Scanner;
public class Array10{

	public static void main(String[] args){

		int arr[] = {1,2,3};
		char choose = 'n';
		do{
			System.out.print("请输入需要添加的数字:");
			Scanner myScanner = new Scanner(System.in);
			int newNum = myScanner.nextInt();
			int arrNew[] = new int[arr.length + 1];
			for(int i = 0; i < arr.length; i++){
				arrNew[i] = arr[i];
			}
			arrNew[arrNew.length - 1] = newNum;
			arr = arrNew;
			System.out.print("添加后的数组元素如下:");
			for(int i = 0; i < arr.length; i++){
				System.out.print(arr[i] + " ");
			}
			System.out.println();
			System.out.print("是否继续添加(y/n):");
			choose = myScanner.next().charAt(0);
		}while(choose == 'y');
	}
}

使用链表可以优化

(七)数组缩减

要求:有一个数组,可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后那个元素。当只剩下最后一个元素,提示不能再缩减。

// 数组缩减
import java.util.Scanner;
public class Array11{

	public static void main(String[] args){

		int arr[] = {1,2,3,4,5,6,7};
		System.out.print("当前的数组元素如下:");
		for(int i = 0; i < arr.length; i++){
			System.out.print(arr[i] + " ");
		}
		System.out.println();
		System.out.print("是否缩减数组(y/n):");
		Scanner myScanner = new Scanner(System.in);
		char choose = myScanner.next().charAt(0);
		while(choose == 'y'){
			if(arr.length == 1){
				System.out.print("数组元素只剩一个,不能再继续缩减");
				break;
			}
			int arrNew[] = new int[arr.length - 1];
			for(int i = 0; i < arrNew.length; i++){
				arrNew[i] = arr[i];
			}
			arr = arrNew;
			System.out.print("缩减后的数组元素如下:");
			for(int i = 0; i < arr.length; i++){
				System.out.print(arr[i] + " ");
			}
			System.out.println();
			System.out.print("是否继续缩减(y/n):");
			choose = myScanner.next().charAt(0);
		}
	}
}

二、排序

排序是将一群数据,依指定的顺序进行排列的过程。

排序的分类:

1、内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序,包括交换式排序法、选择式排序法和插入式排序法。

2、外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序,包括合并排序法和直接合并排序法。

冒泡排序

基本思想:通过对待排序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。

// 冒泡排序
import java.util.Scanner;
public class BubbleSort{

	public static void main(String[] args){

		int arr[] = {24,69,80,57,13};
		int temp;
		for(int i = 0; i < arr.length; i++){
			for(int j = 0; j < arr.length - i - 1; j++){
				if(arr[j] > arr[j + 1]){
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		for(int i = 0; i < arr.length; i++){
			System.out.print(arr[i] + " ");
		}
	}
}

三、查找

常用的查找有两种:顺序查找、二分查找

顺序查找

案例:有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王。猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称。要求:如果找到了,就提示找到,并给出下标值。

// 顺序查找
import java.util.Scanner;
public class SeqSearch{

	public static void main(String[] args){

		String arr[] = {"白眉鹰王","金毛狮王","紫衫龙王","青翼蝠王"};
		System.out.print("请输入名字:");
		Scanner myScanner = new Scanner(System.in);
		String name = myScanner.next();
		boolean flag = true;
		for(int i = 0; i < arr.length; i++){
			if(name.equals(arr[i])){
				System.out.println("已找到该名字,下标值为:" + i);
				flag = false;
				break;
			}
		}
		if(flag){
			System.out.println("找不到该名字");
		}
	}
}

四、多维数组——二维数组

(一)二维数组的使用

1、使用方式1——动态初始化

语法: 类型 数组名[][] = new 类型[大小][大小]

            int a[][] = new int[2][3];

 2、使用方式2——动态初始化

(1)先声明:类型 数组名[][];

(2)再定义(开辟空间)数组名[][] = new 类型[大小][大小];

(3)赋值(有默认值)

3、使用方式3——动态初始化——列数不确定

动态创建下面二维数组:

public class TwoDimensionArray02{

	public static void main(String[] args){

		int arr[][] = new int[3][];
		for(int i = 0; i < arr.length; i++){
			arr[i] = new int[i + 1];
			for(int j = 0; j < arr[i].length; j++){
				arr[i][j] = i + 1;
			}
		}
		for(int i = 0; i < arr.length; i++){
			for(int j = 0; j < arr[i].length; j++){
				System.out.print(arr[i][j] + " ");
			}
			System.out.println();
		}
	}
}

4、使用方式4——静态初始化

public class TwoDimensionArray01{

	public static void main(String[] args){

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

		for(int i = 0; i < arr.length; i++){
			for(int j = 0; j < arr[i].length; j++){
				System.out.print(arr[i][j] + " ");
			}
			System.out.println();
		}
	}
}

 

(二)二维数组使用注意事项和细节

1、一维数组的声明方式有:int[] x 或 int x[]

2、二维数组的声明方式有:int[][] y 或 int[] y[] 或 int y[][]

3、二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。比如:map [][] = {{1,2},{3,4,5}};有map[0]是一个含有两个元素的一维数组,map[1]是一个含有三个元素的一维数组构成,也称为列数不等的二维数组。

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

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

相关文章

ubuntu安装rust教程

参考【Rust】Linux上安装Rust开发环境 sudo apt-get install curl# 注意&#xff0c;不开代理很可能下不到&#xff0c;一直报403 export RUSTUP_DIST_SERVERhttps://mirrors.ustc.edu.cn/rust-static export RUSTUP_UPDATE_ROOThttps://mirrors.ustc.edu.cn/rust-static/rustu…

【软考-中级】系统集成项目管理工程师 【19 项目收尾管理】

持续更新。。。。。。。。。。。。。。。 【第十九章】收尾管理 &#xff08;选择题1分&#xff09; 19.1 项目验收19.2 项目总结19.3系统维护19.3.1软件项目的后续工作19.3.2系统集成项目的后续工作 19.4 项目后评价1. 信息系统目标评价2. 信息系统过程评价3. 信息系统效益评价…

带温度的softmax

用pytorch写一下使用带有温度的softmax的demo import torch import torch.nn.functional as F# 定义带有温度的softmax函数 def temperature_softmax(logits, temperature1.0):return F.softmax(logits / temperature, dim-1)# 输入logits logits torch.tensor([[1.0, 2.0, 3.…

专题二:滑动窗口【优选算法】

滑动窗口&#xff1a; 什么时候用&#xff1f; 同向双指针&#xff08;找单调性&#xff09; 怎么用&#xff1f; 1&#xff09;用left、right指针维护窗口 2&#xff09;进窗口&#xff08;right指针&#xff0c;更新窗口内的值&#xff09; 3&#xff09;判断 出窗口&#xf…

LeetCode13——罗马数字转整数

解题思想&#xff1a; 前后指针 左边比右边小 做减法 左边比右边大 做加法 最后一个数字直接加。 package keepcoding.leetcode.leetcode13;public class Result02 {public static void main(String[] args) {int result romanToInt("XIV");System.out.println(re…

基于springboot实现java学习平台项目【项目源码+论文说明】

基于springboot实现java学习平台演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括学习平台的网络应用&#xff0c;在外国学习平台已经是很普遍的方式&#xff0c;不过国内的管理平台可能还处于起步阶段。学习平台具…

链表收尾(8.2)

例题解析 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 1.拷贝节点插入原节点的后面&#xff08;核心&#xff09; 这样做的目的是方便找 random 节点&#xff0c;知道原节点可以找 random&#xff0c;知道上一个 random 可以找下一个 random 。 struct Node…

四、基本组件

1. Designer设计师 Designer程序是Qt官方推出的专为设计人员使用的UI设计工具&#xff0c;程序员可以使用此工具大幅降低UI设计的代码量。 Designer设计文件的格式是.ui&#xff0c;需要配合同名的头文件与源文件使用。.ui文件通常被称为界面文件&#xff0c;其内部是xml语法的…

(2023|ICML,LLM,标记掩蔽,并行解码)Muse:使用掩蔽生成 Transformer 的文本到图像生成

Muse: Text-To-Image Generation via Masked Generative Transformers 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 模型 2.1. 预训练文本编码器 2.2. 使用 V…

RabbitMQ队列及交换机的使用

目录 一、简单模型 1、首先控制台创建一个队列 2、父工程导入依赖 3、生产者配置文件 4、写测试类 5、消费者配置文件 6、消费者接收消息 二、WorkQueues模型 1、在控制台创建一个新的队列 2、生产者生产消息 3、创建两个消费者接收消息 4、能者多劳充分利用每一个消…

Power BI 傻瓜入门 2. Power BI的人员、方式和内容

本章内容包括&#xff1a; 识别潜在的企业Power BI用户使用Power BI解决数据生命周期问题区分使用Power BI生产的分析产品的类型 企业商业智能&#xff08;BI&#xff09;解决方案并非一刀切&#xff0c;这就是为什么像微软这样的供应商在Power BI利基市场的产品营销和分销中…

unity NPR 卡通渲染

文章目录 一、 介绍二、 素材准备三、 步骤四、 shader代码五、工程链接 一、 介绍 NPR是计算机图形学中的一类&#xff0c;即非真实感绘制(Non-photorealistic rendering)&#xff0c;主要用于模拟艺术式的绘制风格&#xff0c;也用于发展新绘制风格&#xff0c;形式一般是卡…

零基础Linux_20(进程信号)内核态和用户态+处理信号+不可重入函数+volatile

目录 1. 内核态和用户态 1.1 内核态和用户态概念 1.2 内核态和用户态转化 2. 处理信号 2.2 捕捉信号 2.2 系统调用sigaction 3. 不可重入函数 4. volatile关键字 5. SIGCHLD信号&#xff08;了解&#xff09; 6. 笔试选择题 答案及解析 本篇完。 1. 内核态和用户态…

气象台使用vr模拟仿真实训教学降低成本投入

气候仿真实验室用于模拟高低温、高湿、干燥、阳光光照、降雨、降雪、覆冰、雾天与强风等多种环境适应性试验等气候和环境条件&#xff0c;在环境试验中&#xff0c;温度、湿度、光照、降雨这些常见的仿真环境都很容易实现。而比较少见的雾天、强风、降雪等环境就比较难。因此为…

《动手学深度学习 Pytorch版》 9.8 束搜索

本节将介绍几大&#xff1a; 贪心搜索&#xff08;greedy search&#xff09;策略 穷举搜索&#xff08;exhaustive search&#xff09; 束搜索&#xff08;beam search&#xff09; 9.8.1 贪心搜索 贪心搜索已用于上一节的序列预测。对于输出序列的每一时间步 t ′ t t′…

【FPGA零基础学习之旅#16】嵌入式块RAM-双口ram的使用

&#x1f389;欢迎来到FPGA专栏~双口ram的使用 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能指正…

SystemVerilog学习(3)——数组

一、定宽数组 相比于Verilog-1995中的一维定宽数组&#xff0c;SV提供了更加多样的数组类型&#xff0c;功能上也大大增强。 1.1 定宽数组的声明与初始化 Verliog要求在声明中必须给出数组的上下界。因为几乎所有的数组都使用0作为索引下届&#xff0c;所以SV允许只给出数组的…

UART、SPI、I2C通信协议超全入门教程

本文引注: https://mp.weixin.qq.com/s/lVWK8xlDt7cOLi8WHYSuPg 1.SPI协议 1.基础 2.简介 3.工作原理 4.SPI数据传输步骤与优缺点 2.UART协议

抖音同城榜:探索城市新潮流

随着科技的飞速发展&#xff0c;短视频已经成为了人们日常生活中不可或缺的一部分。作为短视频领域的佼佼者&#xff0c;抖音一直致力于为用户带来更丰富、更有趣的短视频内容。抖音同城榜应运而生&#xff0c;成为了最新、最热门的话题聚集地&#xff0c;吸引了大量潮流达人和…

Java SSL/TLS证书认证逻辑

前言 最近做项目使用httpclient转发https请求&#xff0c;但是遇到一些坑&#xff0c;尤其是证书的认证&#xff0c;证书认证一般都是单向的&#xff0c;除非相互访问&#xff0c;证书一般基于host&#xff0c;但是如果访问需要ip&#xff0c;那么JDK默认的认证就会不通过&…