【日撸 Java 三百行】Day 11(顺序表(一))

news2025/5/13 10:41:47

目录

Day 11:顺序表(一)

一、关于顺序表

二、关于面向对象

三、代码模块分析

1. 顺序表的属性

2. 顺序表的方法

四、代码及测试

拓展:

小结


Day 11:顺序表(一)

Task:

        在《数据结构》中, 使用“抽象数据类型”来描述不同的数据结构. 在《面向对象程序设计》中, 用对象来存储数据及其上的操作. 我认为, 它们的本质都是相同的.

  • 对象: 数据及其上操作的总和. 例如, 我是一个对象, 具有身高、体重、年龄、跑步速度等数据; 同时,我具有吃饭、睡觉、送快递等功能. 从计算机的发展来看, 第一阶段以操作 (函数) 为中心, 一个计算导弹轨迹的函数, 根据不同输入获得不同输出. 第二阶段以数据为中心, 即数据存放于数据库, 使用不同的算法来处理它. 第三阶段认为数据及其上的操作是统一不可分的, 这就到了面向对象.
  • 类. 前面已经使用过 int i; 这类代码, int 就是类型, i 是一个具体的整数变量. 同理, 对象就是属于某种类的变量. 也可以用集合的方式来理解: 类是集合, 对象是其中的元素; int 是指所有整数的集合, i 是其中的一个元素.
  • 包. 包并非程序设计必须的东西, 其作用仅仅是将类进行合理的组织. 但是, 在计算机界, 往往这种可有可无的东西才是最重要的. 如文档、注释、编码规范. 可有可无是针对程序的运行而言, 其核心是计算机; 而重要是针对程序的易读性、可维护性而言, 其核心是程序员.
  • 常量用 final 修饰. 这里故意把 MAX_LENGTH 设置得比较少, 方便调拭后面的越界检查代码.
  • 用 new 生成新的对象.
  • 有一个成员变量叫做 length. 程序里还有用 length 表示一个整数数组的长度. 实际上, 同一个变量名可以被不同的类所使用, 例如: 人有体重, 西瓜也有重量. 由于限定了不同的类、不同的对象, 它们之间就不会有冲突. 张三的体重、李四的体重,有关联才奇怪了. 这段描述写出来怪怪的, 明明现实生活中就是如此. 但这也正是体现了面向对象的特点: 比面向过程的程序设计更贴合我们的人类认知, 也就更远离机器底层.
  • toString 这个方法很特殊, 它覆盖了 Object 类的相应方法. 可以看到, 在 println 里面使用 tempFirstList 里, 由于是用另一个字符串与其相加, 系统会自动调用 tempFirstList.toString().

一、关于顺序表

        详细的介绍,可以参考这一篇学习笔记:【数据结构】线性表-CSDN博客
        虽然学习笔记中是用 C++ 来实现的,但是构建顺序表的思维模式是相同的,举一反三即可。接下来简单说说顺序表。

        顺序表从属于线性表这一个大类 。线性表,全名为线性存储结构,使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。
        按顺序方式存储的线性表称为顺序表(array-based list),又称为向量(vector),通过创建数组来建立。顺序表中的每个元素按其顺序有唯一的索引值,又称下标值,可以用来方便地访问元素内容。

        一般来说,所有的编程语言模拟顺序表的方法都是通过数组,因为数组的存储与逻辑结构与顺序表几乎完全一致。

二、关于面向对象

        在学习 C++ 时,为了引入 “类” 的概念,我们初步接触了 “面相对象” 这一程序设计原则。

        那么我们为什么要重谈 “类” 这个概念呢?首先,我们需要区分面向过程的程序设计和面向对象的程序设计有何区别。

        面向过程的程序设计是以具体的解题过程为研究和实现的主体,而面向对象的程序设计是以需解决的问题中所涉及的各种对象为主体。
        在面向对象的方法学中,“对象”是现实世界的实体或概念在计算机逻辑中的抽象表示。具体地,对象是具有唯一对象名和对外接口的一组属性和操作的集合。例如,将现实中的“人”抽象来,它具有姓名、年龄、住址等属性,同时具有设置住址、获得年龄、跑动、跳舞等对外的接口和操作。
        面向对象的问题求解就是力图从实际问题中抽象出这些封装了数据和操作的对象,通过定义接口来描述它们的地位及与其他对象的关系,最终形成一个广泛联系的对象模型系统。相对于传统的面向过程的程序设计方法,面向对象的程序设计具有如下的优点

  1. 对象的数据封装特性消除了传统结构方法中数据与操作分离所带来的种种问题提高了程序的可复用性和可维护性,降低了程序员保持数据与操作相容的负担。
  2. 对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。
  3. 对象作为独立的整体具有良好的自洽性。即,它可以通过自身定义的操作来管理自己。一个对象的操作可以完成两类功能,一是修改自身的状态,二是向外界发布消息。当一个对象欲影响其他对象时,它需要调用其他对象自身的方法,而不是直接去改变那个对象。这样可以维护对象的完整性。
  4. 对象之间通过一定的接口和相应的消息机制相联系。这个特性与对象的封装性结合在一起,较好地实现了信息的隐藏。使用对象时只需要了解其接口提供的功能操作即可而不必了解对象内部的数据描述和具体的功能实现。
  5. 继承是面向对象方法中除封装外的另一个重要特性。通过继承可以很方便地实现应用的扩展和已有代码的重复使用,在保证质量的前提下提高开发效率。

        在今天的代码中,我们会较为频繁的涉及 关键字final重载,这部分与 C++ 有异曲同工之妙,理解起来并不是很难。但为了保证自己对知识的掌握程度以及理解程度,这里还是单开一篇博文来讲述,可以参考这一篇学习笔记: 

三、代码模块分析

        有了基础知识的储备后,我们可以开始完成今天的任务了。

1. 顺序表的属性

	/**
	 * The maximal length of the list. It is a constant.
	 */
	public static final int MAX_LENGTH = 10;

	/**
	 * The actual length not exceeding MAX_LENGTH. Attention: length is not only the
	 * member variable of Sequential list, but also the member variable of Array. In
	 * fact, a name can be the member variable of different classes.
	 */
	int length;

	/**
	 * The data stored in an array.
	 */
	int[] data;

        这些内容是对于顺序表数据结构需要使用的属性,本代码构建的是静态创建的顺序表,因此在最开始就需要限定顺序表的分配长度而无法在后期再更改(MAX_LENGTH)。所以使用了final int这个关键字,综上,final限制基本的系统数据类型后,此类型无法被更改,如同常量一样(就像C++的const,另外这种常量声明的名称标识都必须是大写表示,这虽然不是编译器强制的,但是是我们统一的习惯)

2. 顺序表的方法

        需要说明的是,此类的名称要求统一命名为SequentialList()

	public SequentialList() {
		length = 0;
		data = new int[MAX_LENGTH];
	}// Of the first constructor

	/**
	 *********************
	 * Construct a sequential list using an array.
	 * 
	 * @param paraArray The given array. Its length should not exceed MAX_LENGTH.
	 *                  For simplicity now we do not check it.
	 *********************
	 */
	public SequentialList(int[] paraArray) {
		data = new int[MAX_LENGTH];
		length = paraArray.length;

		// Copy data.
		for (int i = 0; i < paraArray.length; i++) {
			data[i] = paraArray[i];
		} // Of for i
	}// Of the second constructor

	/**
	 *********************
	 * Overrides the method claimed in Object, the superclass of any class.
	 *********************
	 */
	public String toString() {
		String resultString = "";

		if (length == 0) {
			return "empty";
		} // Of if

		for (int i = 0; i < length - 1; i++) {
			resultString += data[i] + ",";
		} // Of for i

		resultString += data[length - 1];

		return resultString;
	}// Of toString

	/**
	 *********************
	 * Reset to emppty
	 *********************
	 */
	public void reset() {
		length = 0;
	}// Of reset

        这里对于构造函数使用了重载,public SequentialList()创建了个无参构造函数,public SequentialList(int[] paraArray)构造了输入数组作为参数的构造函数。前者适合于一般情况下我们初始化顺序表的操作,后者能非常快捷完成数据的复制操作。

        此外,这里还重写了Object的toString()方法(Java中所有类都是Object类的儿子),因为这个方法与print()方法挂钩,重写了这个方法后,我们创建的对象就能通过print操作打印出数据,能更加方便数据的使用以及可读性。

        最后,参考 “线性表” 学习笔记,我们知道,还可以构建其他辅助的方法,如 append,insert,setValue 等方法。

四、代码及测试

package datastructure.list;

/**
 * Sequential list.
 *
 * @author: Changyang Hu joe03@foxmail.com
 * @date created: 2025-05-12
 */
public class SequentialList {

	/**
	 * The maximal length of the list. It is a constant.
	 */
	public static final int MAX_LENGTH = 10;

	/**
	 * The actual length not exceeding MAX_LENGTH. Attention: length is not only
	 * the member variable of Sequential list, but also the member variable of
	 * Array. In fact, a name can be the member variable of different classes.
	 */
	int length;

	/**
	 * The data stored in an array.
	 */
	int[] data;

	/**
	 * 
	 *********************
	 * @Title: SquentialList
	 * @Description: Construct an empty sequential list.
	 * 
	 * @return void 
	 *********************
	 */
	public SequentialList() {
		length = 0;
		data = new int[MAX_LENGTH];
	}// Of the first constructor

	/**
	 *********************
	 * Construct a sequential list using an array.
	 * 
	 * @param paraArray
	 * 				The given array. Its length should not exceed MAX_LENGTH. For
	 *            	simplicity now we do not check it.
	 *********************            
	 */
	public SequentialList(int[] paraArray) {
		data = new int[MAX_LENGTH];
		length = paraArray.length;

		// Copy data
		for (int i = 0; i < paraArray.length; i++) {
			data[i] = paraArray[i];
		} // Of for i
	}// Of the second constructor

	/**
	 *********************
	 * Overrides the method claimed in Object, the superclass of any class.
	 *********************
	 */
	public String toString() {
		String resultString = "";

		if (length == 0) {
			return "empty";
		} // Of if

		for (int i = 0; i < length; i++) {
			resultString += data[i] + ",";
		} // Of for i

		resultString += data[length - 1];

		return resultString;
	}// Of toString

	/**
	 * 
	 *********************
	 * @Title: reset
	 * @Description: Reset to empty.
	 * 
	 * @return void 
	 *********************
	 */
	public void reset() {
		length = 0;
	}// Of reset

	/**
	 * 
	 *********************
	 * @Title: main
	 * @Description: The entrance of the program.
	 *
	 * @param args Not used now.
	 * @return void 
	 *********************
	 */
	public static void main(String args[]) {
		int[] tempArray = { 1, 4, 6, 9 };
		SequentialList tempFirstList = new SequentialList(tempArray);
		System.out.println("Initialized, the list is: " + tempFirstList.toString());
		System.out.println("Again, the list is: " + tempFirstList);

		tempFirstList.reset();
		System.out.println("After reset, the list is: " + tempFirstList);
	}// Of main

}// Of clas SequentialList

        其中,需要注意的是第一二行,我们用了两种不同的输出方式,一种调用了我们重构的 toString()  函数,另一种是通过 println() 函数中对 List 的特殊处理方式。

拓展:

        顺序表基本概念:【数据结构】线性表-CSDN博客

        类、包和接口:


小结

        顺序表作为我们最开始接触到的数据结构,难度是很小的,因为其内核思想符合我们正常思维,即 “按顺序先来后到”
        但是,从实践层面来看,有人说,很多计算机的问题,本质上都可以视为字符串的处理。字符串处理是数据处理中最基础也是最麻烦也是的问题,而字符串本身上就是顺序表的字符表现。
        计算机算法领域的非常重要的查找与排序问题也是属于顺序表问题,SQL数据库中也充满各种顺序表的信息展现,其中是否能选取合理的索引结构,能影响整个数据库的效率。

        所以综上所述,顺序表也是很困难的。因为我们选择了最简单的按顺序存储,所以在实现对全局数据的操控中(如插入,查询等),就需要我们去花心思研究高效的算法。

        因为,本质上,这是逻辑丰富与物理存储单一的矛盾

        同时,还需要注意一点,从这一次学习开始,我们会接触越来越多的数据结构,因此固定库给的函数肯定是无法处理所有结构的。为了解决这一问题,我们需要去重构不同的函数。数据结构可能是不同的,但其方法的目的是有共通性的。在学习的过程中,不断去总结,感悟,从而一步一步提高自身的代码能力和素养。

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

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

相关文章

软考 系统架构设计师系列知识点之杂项集萃(55)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;54&#xff09; 第89题 某软件公司欲开发一个Windows平台上的公告板系统。在明确用户需求后&#xff0c;该公司的架构师决定采用Command模式实现该系统的界面显示部分&#xff0c;并设计UML类图如…

保持Word中插入图片的清晰度

大家有没有遇到这个问题&#xff0c;原本绘制的高清晰度图片&#xff0c;插入word后就变模糊了。先说原因&#xff0c;word默认启动了自动压缩图片功能&#xff0c;分享一下如何关闭这项功能&#xff0c;保持Word中插入图片的清晰度。 ①在Word文档中&#xff0c;点击左上角的…

Linux复习笔记(三) 网络服务配置(web)

遇到的问题&#xff0c;都有解决方案&#xff0c;希望我的博客能为你提供一点帮助。 二、网络服务配置 2.3 web服务配置 2.3.1通信基础&#xff1a;HTTP协议与C/S架构&#xff08;了解&#xff09; ​​HTTP协议的核心作用​​ Web服务基于HTTP/HTTPS协议实现客户端&#xff…

springboot旅游小程序-计算机毕业设计源码76696

目 录 摘要 1 绪论 1.1研究背景与意义 1.2研究现状 1.3论文结构与章节安排 2 基于微信小程序旅游网站系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统…

uniapp自定义导航栏搭配插槽

<uni-nav-bar dark :fixed"true" shadow background-color"#007AFF" left-icon"left" left-text"返回" clickLeft"back"><view class"nav-bar-title">{{ navBarTitle }}</view><block v-slo…

MFC listctrl修改背景颜色

在 MFC 中修改 ListCtrl 控件的行背景颜色&#xff0c;需要通过自绘&#xff08;Owner-Draw&#xff09;机制实现。以下是详细的实现方法&#xff1a; 方法一&#xff1a;通过自绘&#xff08;Owner-Draw&#xff09;实现 步骤 1&#xff1a;启用自绘属性 在对话框设计器中选…

SpringBoot+Dubbo+Zookeeper实现分布式系统步骤

SpringBootDubboZookeeper实现分布式系统 一、分布式系统通俗解释二、环境准备&#xff08;详细版&#xff09;1. 软件版本2. 安装Zookeeper&#xff08;单机模式&#xff09; 三、完整项目结构&#xff08;带详细注释&#xff09;四、手把手代码实现步骤1&#xff1a;创建父工…

Linux进程10-有名管道概述、创建、读写操作、两个管道进程间通信、读写规律(只读、只写、读写区别)、设置阻塞/非阻塞

目录 1.有名管道 1.1概述 1.2与无名管道的差异 2.有名管道的创建 2.1 直接用shell命令创建有名管道 2.2使用mkfifo函数创建有名管道 3.有名管道读写操作 3.1单次读写 3.2多次读写 4.有名管道进程间通信 4.1回合制通信 4.2父子进程通信 5.有名管道读写规律&#xff…

精品可编辑PPT | 全面风险管理信息系统项目建设风控一体化标准方案

这份文档是一份全面风险管理信息系统项目建设风控一体化标准方案&#xff0c;涵盖了业务架构、功能方案、系统技术架构设计、项目实施及服务等多个方面的详细内容。方案旨在通过信息化手段提升企业全面风险管理工作水平&#xff0c;促进风险管理落地和内部控制规范化&#xff0…

YOLOv8网络结构

YOLOv8的网络结构由输入端(Input)、骨干网络(Backbone)、颈部网络(Neck)和检测头(Head)四部分组成。 YOLOv8的网络结构如下图所示&#xff1a; 在整个系统架构中&#xff0c;图像首先进入输入处理模块&#xff0c;该模块承担着图像预处理与数据增强的双重任务。接着&#xff0c…

笔记本电脑升级实战手册【扩展篇1】:flash id查询硬盘颗粒

文章目录 前言&#xff1a;一、硬盘颗粒介绍1、MLC&#xff08;Multi-Level Cell&#xff09;2、TLC&#xff08;Triple-Level Cell&#xff09;3、QLC&#xff08;Quad-Level Cell&#xff09; 二、硬盘与主控1、主控介绍2、主流主控厂家 三 、硬盘颗粒查询使用flash id工具查…

AutoDL租用服务器教程

在跑ai模型的时候&#xff0c;容易遇到算力不够的情况。此时便需要租用服务器。autodl是个较为便宜的服务器租用平台&#xff0c;h20仅需七点几元每小时。下面是简单的介绍。 打开网站AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL&#xff0c;并登录账号 登录后&#xff…

goner/otel 在Gone框架接入OpenTelemetry

文章目录 背景与意义快速上手&#xff1a;五步集成 OpenTelemetry运行效果展示代码详解与实践目录结构说明组件加载&#xff08;module.load.go&#xff09;业务组件示例&#xff08;your_component.go&#xff09;程序入口&#xff08;main.go&#xff09; 进阶用法与最佳实践…

杨校老师项目之基于SSM与JSP的鲜花销售系统-【成品设计含文档】

基于SSMJSP鲜花商城系统 随着电子商务的快速发展&#xff0c;鲜花在线销售已成为一种重要的消费模式。本文设计并实现了一个基于JSP技术的鲜花销售管理系统&#xff0c;采用B/S架构&#xff0c;使用SSM框架进行开发&#xff0c;并结合Maven进行项目依赖管理。系统分为前台用户模…

springboot集成langchain4j实现票务助手实战

前言 看此篇的前置知识为langchain4j整合springboot&#xff0c;以及springboot集成langchain4j记忆对话。 Function-Calls介绍 langchain4j 中的 Function Calls&#xff08;函数调用&#xff09;是一种让大语言模型&#xff08;LLM&#xff09;与外部工具&#xff08;如 A…

Feed流推送之订阅推送

分类 feed流分为TimeLine和智能排序&#xff0c;前者不对内容进行过滤&#xff0c;一般根据发布的时间来进行排序&#xff0c;一般用于好友动态或者推送关注的人的消息&#xff0c;而后者一般有着复杂的算法&#xff0c;可以根据算法智能地向目标用户推送内容&#xff0c;例如…

wordpress自学笔记 第四节 商城菜单的添加和修改美化

wordpress自学笔记 摘自 超详细WordPress搭建独立站商城教程-第四节 商城菜单的添加和修改美化&#xff0c;2025 WordPress搭建独立站商城#WordPress建站教程https://www.bilibili.com/video/BV1UwwgeuEkK?spm_id_from333.788.videopod.sections&vd_sourcea0af3bbc6b6d…

GPU L2 Cache一致性协议对科学计算的影响研究

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、GPU缓存层级革命&#xff1a;从Volta到Hopper的演进图谱 1.1 架构级缓存策略对比 ‌Vo…

【速写】KV-cache与解码的再探讨(以束搜索实现为例)

文章目录 1 Beam Search 解码算法实现2 实现带KV Cache的Beam Search解码3 关于在带kv-cache的情况下的use_cache参数 1 Beam Search 解码算法实现 下面是一个使用PyTorch实现的beam search解码算法&#xff1a; 几个小细节&#xff1a; 束搜索可以加入length_penalty&#…

(网络)应用层协议-HTTPS

1.HTTPS是什么&#xff1f; HTTPS是应用层的一种协议&#xff0c;是在HTTP的基础上进行了加密层的处理。 HTTP协议的内容都是按照文本的形式进行传输的&#xff0c;所以呢就很容易被别人知道传输的是什么。 我们在了解了TCP/IP之后是知道我们的数据在传输的过程中是通过路由器进…