week 3 - More on Collections - Lecture 3

news2025/3/5 21:40:36

一、Motivation


1.    Java支持哪种类型的一维数据结构?
Java中用于在单一维度中存储数据的数据结构,如arrays or ArrayLists.


2.    如何在Java下创建一维数据结构?(1-dimensional data structure)
定义和初始化这些一维数据结构

int[] arr = new int[10];

int[] numbers = {1, 2, 3, 4, 5};  // 使用初始化语法创建并赋值

<Integer> list = new ArrayList<>();用于动态列表


3.    我们如何使用它们?如何maintain它们?
数组或列表中添加、删除或访问元素。

维数据结构主要包括对其进行动态管理和更新,包括扩展大小、添加新元素、删除元素、检查元素等操作


4.    我们可以在Java下迭代一维数据结构吗?
for或for-each这样的循环来遍历一维结构(如数组或列表)中的元素。

• 数组用于固定大小的数据存储,适用于已知大小且不需要频繁扩展的场景。

• ArrayList 用于动态大小的数据存储,适用于需要频繁修改数据的场景。

二、Menu

• Collections and List

• Using List and ArrayList

• Iterators

三、Comments on code style        代码风格的注释

1. 省略 this. 关键字

 一般情况下,我们不需要在方法调用前加上 this.,除非在构造函数或方法内部需要明确区分实例变量和局部变量时才使用。

• 不推荐的写法:this.loadFromFile(fname);

• 推荐的写法:loadFromFile(fname);

• Explanation: 在 Java 中,如果没有命名冲突,通常不需要使用 this 关键字来调用实例方法或访问实例变量。

2. 省略包含单一语句的花括号 {}

 如果 if、while 等控制语句只包含一个语句,那么可以省略 {},使代码更加简洁。

• 不推荐的写法

while (i < name.length) {
    name[i] = null;
}

• 推荐的写法

while (i < name.length)
    name[i] = null;

四、集合类型 (Collection Types)

 Java 集合框架 的接口和类的层次结构,并展示了如何使用它们来处理数据。

1. 接口

 Collection 是一个通用接口,表示一个元素集合,所有 Java 集合框架的实现都继承自该接口。

 List 是 Collection 接口的子接口,表示一种有序集合,允许重复的元素。

2. 

 ArrayList 和 LinkedList 是实现了 List 接口的具体类,分别基于动态数组和链表结构。

3. 接口的继承关系

• List 继承自 Collection,并且它实现了多种有序的集合操作。例如,ArrayList<E> 是基于动态数组实现的,而 LinkedList<E> 是基于链表实现的。

4. 子接口扩展

• 子接口(如 List)会继承父接口(如 Collection)的方法,并且可以添加自己的特有方法。

The sub interface has all the methods of the super interface

五、Methods on Collection and List

1. Collection 接口中的方法

• isEmpty(): 判断集合是否为空,返回 boolean 类型。

• size(): 返回集合中元素的个数,返回 int 类型。

• contains(E elem): 判断集合中是否包含指定元素,返回 boolean 类型。

• add(E elem): 向集合中添加元素,返回 boolean 类型,表示是否成功添加。

• remove(E elem): 移除集合中的指定元素,返回 boolean 类型,表示是否成功移除。

• iterator(): 返回一个迭代器对象,用于遍历集合中的元素。

 // 获取 Iterator 对象

        Iterator<String> iterator = list.iterator();

        // 使用迭代器遍历元素

        while (iterator.hasNext()) {

            String fruit = iterator.next();

            System.out.println(fruit);

        }

Iterator 接口 定义了三个常用方法:

1. hasNext():检查是否还有下一个元素。

2. next():获取下一个元素。

3. remove():删除当前元素(可选操作)。

 

2. List 接口中的方法

E 代表的是 “元素”(Element)的泛型类型参数。它是一个通用的类型参数,通常用于表示集合中存储的对象类型。比如,List<E> 就表示 一个可以存储任意类型元素的列表

• add(int index, E elem): 在指定位置 index 插入元素 elem。

• remove(int index): 移除指定位置的元素,返回被移除的元素。

• get(int index): 获取指定位置的元素,返回该元素。

• set(int index, E elem): 替换指定位置的元素,返回被替换的元素。

• indexOf(E elem): 返回指定元素在列表中的位置(索引),如果元素不存在则返回 -1。

• subList(int from, int to): 返回一个新的子列表,从 from 索引到 to 索引之间的元素。

六、使用集合类型 (Using a collection type)

1. 声明集合类型变量

变量或字段应声明为接口类型,而不是具体实现类。这是为了使代码更加灵活,可以随时更换具体的实现类(例如从 ArrayList 切换到 LinkedList)。

List 是一个接口,代表有序集合,它有多个具体的实现类,如 ArrayList 和 LinkedList。当你声明一个集合类型时,最好使用接口类型(例如 List),而不是具体的实现类(例如 ArrayList 或 LinkedList)。

• 示例:The type between “<“ and “>” is the type of the elements

// 声明为 List 接口类型,具体实现可以是 ArrayList 或 LinkedList

private List<Task> tasks;

// 创建具体实现对象时,可以选择不同的实现类

tasks = new ArrayList<Task>();  // 使用 ArrayList 实现

// 或者

tasks = new LinkedList<Task>();  // 使用 LinkedList 实现

 这里的 List<Task> 表示任务的集合,Task 是任务对象的类型。

2. 创建集合对象

使用实现了集合接口的类来创建对象。比如,通过 ArrayList 或 LinkedList 来实现 List 接口。

• 示例:

tasks = new ArrayList<Task>();

• 这行代码创建了一个 ArrayList 类型的 tasks 集合,存储 Task 类型的元素。

3. 操作集合中的元素

• 一旦创建了集合对象,就可以调用集合方法来访问或修改集合中的元素,例如:

• add() 用于添加元素,

• remove() 用于删除元素,

• get() 用于获取元素等。

七、Example

1. TodoList – 任务的集合

• TodoList 是一个任务集合,用于按顺序管理需要完成的任务。任务按照它们应该完成的顺序存储在集合中。

集合的类型是 List,其中 Task 是任务对象的类型。

Collection type: List of tasks

2. TodoList 的要求

• 从文件中读取任务列表: 可以通过文件存储任务,并从中读取任务列表。

• 显示所有任务: 提供一个方法来显示当前所有的任务,确保任务列表是清晰的。

• 添加任务: 可以在列表的末尾添加新任务,或者在指定的位置插入任务。

• 删除任务: 从列表中删除指定的任务。

• 移动任务: 将任务从一个位置移动到另一个位置,确保任务按顺序执行。

实现了 ActionListener 接口的 TodoList 类。它的作用是从文件中读取任务列表并存储在 List<Task> 类型的集合中

public class TodoList implements ActionListener{ 

        private List<Task> tasks;

        public void readTasks(String fname){

            try {

                     Scanner sc = new Scanner(new File(fname));

                     tasks = new ArrayList<Task>();

                      while ( sc.hasNext() )

                                tasks.add(new Task(sc.next()));

                      sc.close();

        } catch(IOException e){…}

        displayTasks();

        }

 

 askTask() 和 askIndex() 方法用于向用户询问任务内容或索引值。

3. Iterator 在 Java 中的应用 

(1) for-each 循环转为 Iterator:

for (Task task : tasks){

textArea.append(task + "\n");

for-each 循环 本质上是 Iterator 的一种简化写法。

Iterator<Task> iter = tasks.iterator();
while (iter.hasNext()) {
    Task task = iter.next();
    textArea.append(task + "\n");
}

(2) Iterator 接口:

• Iterator 接口有两个主要方法:

• hasNext():检查是否有下一个元素。

• next():返回下一个元素。

public interface Iterator<E> {
    public boolean hasNext();
    public E next();

 使用 Iterator 遍历 List<String> 中的元素。

for ( String str : items) System.out.print(str + “, “);

Iterator<String> iter = items.iterator();

while (iter.hasNext()){

        String str = iter.next();

        System.out.print(str + “, “);

}

八、List 与数组(Array)的对比​​​​​​​

1. List 的优势:

• 没有大小限制,可以根据需要自动增长。

• 提供了很多内置方法,如 add()、get()、remove() 等,操作更加方便。

2. 数组的局限性:

• 数组大小固定,不能动态扩展。如果需要改变数组的大小,必须创建新的数组。

• 数组操作比较麻烦,尤其是需要处理元素的添加、删除时,必须手动处理大小和位置的变动。

 

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

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

相关文章

机器学习11-经典网络解析

机器学习11-经典网络解析 AlexNetImageNet 大规模视觉识别挑战赛一、赛事背景与目的二、数据集与任务设置三、参赛规则与流程四、评审标准与机制五、历史与影响六、中国团队的表现 贡献解析CONV1层MaxP00L1层NORM1层CONV2层 CONV3、CONV4层CONV4&#xff0c;Max POOL3 层FC6、F…

【数据结构】链表与顺序表的比较

链表和顺序表是两种常见的数据结构&#xff0c;各有优缺点&#xff0c;适用于不同的场景。 ### 顺序表&#xff08;数组&#xff09; 顺序表在内存中连续存储元素&#xff0c;支持随机访问。 **优点&#xff1a;** 1. **随机访问**&#xff1a;通过索引直接访问元素&#xf…

【JavaScript—前端快速入门】JavaScript 基础语法

JavaScript 基础语法 1. 变量 创建变量(变量定义 / 变量声明 / 变量初始化)&#xff0c;JS 声明变量有3种方式 2. 通过打印日志&#xff0c;查看变量类型 JavaScript 是一门动态弱类型语言&#xff0c;变量可以存放不同类型的值(动态) 接下来&#xff0c;我们通过使用 log 指令…

deepseek助力运维和监控自动化

将DeepSeek与Agent、工作流及Agent编排技术结合&#xff0c;可实现IT运维与监控的智能化闭环管理。以下是具体应用框架和场景示例&#xff1a; 一、智能Agent体系设计 多模态感知Agent 日志解析Agent&#xff1a;基于DeepSeek的NLP能力&#xff0c;实时解析系统日志中的语义&a…

springboot在业务层校验对象/集合中字段是否符合要求

springboot在业务层校验对象参数是否必填 1.场景说明2.代码实现 1.场景说明 为什么不在控制层使用Validated或者Valid注解直接进行校验呢&#xff1f;例如通过excel导入数据&#xff0c;将excel数据转为实体类集合后&#xff0c;校验集合中属性是否符合要求。 2.代码实现 定义…

【UCB CS 61B SP24】Lecture 17 - Data Structures 3: B-Trees 学习笔记

本文以 2-3-4 树为例详细讲解了 B 树的概念&#xff0c;逐步分析其操作&#xff0c;并用 Java 实现了标准的多阶 B 树。 1. 2-3 & 2-3-4 Trees 上一节课中讲到的二叉搜索树当数据是随机顺序插入的时候能够使得树变得比较茂密&#xff0c;如下图右侧所示&#xff0c;时间复…

论文阅读笔记:UniFace: Unified Cross-Entropy Loss for Deep Face Recognition

论文阅读笔记&#xff1a;UniFace: Unified Cross-Entropy Loss for Deep Face Recognition 1 背景2 创新点3 方法3.1 回顾softmax损失3.2 统一交叉熵损失3.3 人脸验证中的UCE损失3.4 进一步的优化3.4.1 边际UCE损失3.4.2 平衡BCE损失 4 实验4.1 消融实验4.2 和SOTA方法对比 论…

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十) 收发消息

1.聊天框 首先我们完善前端的消息输入框 components下面新建MessageInput组件 import { useState,useRef } from "react" import {X,Image,Send} from "lucide-react"import { useChatStore } from "../store/useChatStore" import toast from…

5分钟看懂Deepseek开源周之六:Deepseek-V3/R1推理系统设计----揭开深度求索模型系统设计和运营成本之谜

前言 众所周知&#xff0c;四大天王一般有五个人。所以开源周五连发有第六天也很正常。贴上了开源周活动的github主贴&#xff0c;大家可以不上推特就能了解详情。 deepseek-ai/open-infra-index: Production-tested AI infrastructure tools for efficient AGI development a…

C++发展

目录 ​编辑C 的发展总结&#xff1a;​编辑 1. C 的早期发展&#xff08;1979-1985&#xff09; 2. C 标准化过程&#xff08;1985-1998&#xff09; 3. C 标准演化&#xff08;2003-2011&#xff09; 4. C11&#xff08;2011年&#xff09; 5. C14&#xff08;2014年&a…

动态规划/贪心算法

一、动态规划 动态规划 是一种用于解决优化问题的算法设计技术&#xff0c;尤其适用于具有重叠子问题和最优子结构性质的问题。它通过将复杂问题分解为更简单的子问题&#xff0c;并保存这些子问题的解以避免重复计算&#xff0c;从而提高效率。 动态规划的核心思想 最优子结…

python全栈-Linux基础

python全栈-Linux基础 文章目录 Linux安装/配置网络配置配置Linux远程登录配置虚拟机内部ip配置真机的ip安装XShell和Xftp目录结构用户和用户组用户管理添加用户useradd查看用户id修改用户usermod (选项)(参数)用户密码设置passed (选项)(参数)删除用户userdel [选项] 用户名 用…

基于https虚拟主机配置

一、https介绍 http 明文&#xff0c;80/tcp https 密文&#xff0c;443/tcp 二、安全性保障 1、数据安全性 数据加密 2、数据完整性 3、验证身份的真实性、有效性 三、数据安全性 手段&#xff1a;加密 发送方加密数据&#xff0c;接收方解密数据 对称加密算法 加密、解密数据…

Kmeans算法来实现RFM指标计算步骤

K-Means&#xff08;K均值&#xff09;是一种经典的无监督聚类算法&#xff0c;主要用于将数据集划分为 KKK 个不同的簇&#xff08;Cluster&#xff09;。 它基于最小化簇内样本的平方误差&#xff0c;即最小化数据点与簇中心的距离之和。 1. K-Means 算法原理 (1) 主要步骤 …

Vue2-3 优雅的在子组件修改父组件传递过来的v-model

在子组件修改父组件传递过来的v-model&#xff0c;这样会破坏单向数据流&#xff0c;造成屎山代码&#xff0c;为了避免这个问题&#xff0c;需要给一个中间层来相对舒服的使用v-model。方法就是用computed去拦截v-model,然后在computed 里面去触发 emit 事件来修改父组件传来的…

threejs:用着色器给模型添加光带扫描效果

第一步&#xff1a;给模型添加光带 首先创建一个立方体&#xff0c;不进行任何缩放平移操作&#xff0c;也不要set position。 基础代码如下&#xff1a; 在顶点着色器代码里varying vec3 vPosition;vPosition position;获得threejs自动计算的顶点坐标插值&#xff08;也就…

1.从0搭建前端Vue项目工程

我们通过vue官方提供的脚手架Vue-cli来快速生成一个Vue的项目模板。 **注意&#xff1a;**需要先安装NodeJS&#xff0c;然后才能安装Vue-cli。 环境准备好了&#xff0c;接下来我们需要通过Vue-cli创建一个vue项目&#xff0c;然后再学习一下vue项目的目录结构。Vue-cli提供了…

开放鸿蒙OpenHarmony 5.0.0 Release 兼容性测试实战经验分享

OpenHarmony 5.0版本的发布时间是2024年12月20日至21日。这个版本带来了许多新特性和改进。现在5.0出了两个release 版本&#xff0c;分别是5.0.0和5.0.1。 就在5.0版本发布不到2周的时间内&#xff0c;2025年01月01日起&#xff0c;不支持新产品基于老分支&#xff08;OpenHar…

Chromium_src源码

Chromium_src源码 码云上有一个OpenHarmony-TPC/chromium_src项目&#xff0c;目前已经停止维护了&#xff0c;迁移到GitCode上了&#xff0c;源代码项目地址为&#xff1a;openharmony-tpc/chromium_chrome 特此记录一下老的项目的相关软件架构 Chromium 简介 软件架构 软…

深度学习的正则化深入探讨

文章目录 一、说明二、学习目标三、什么是机器学习中的正则化四、了解过拟合和欠拟合五、代价函数的意义六、什么是偏差和方差&#xff1f;七、机器学习中的正则化&#xff1f; 一、说明 在训练机器学习模型时&#xff0c;模型很容易过拟合或欠拟合。为了避免这种情况&#xf…