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

week 3 - More on Collections - Lecture 3

一、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. 数组的局限性:

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

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

 

相关文章:

week 3 - More on Collections - Lecture 3

一、Motivation 1. Java支持哪种类型的一维数据结构&#xff1f; Java中用于在单一维度中存储数据的数据结构&#xff0c;如arrays or ArrayLists. 2. 如何在Java下创建一维数据结构&#xff1f;&#xff08;1-dimensional data structure&#xff09; 定义和初始化这些一…...

Pwntools 的详细介绍、安装指南、配置说明

Pwntools&#xff1a;Python 开源安全工具箱 一、Pwntools 简介 Pwntools 是一个由 Security researcher 开发的 高效 Python 工具库&#xff0c;专为密码学研究、漏洞利用、协议分析和逆向工程设计。它集成了数百个底层工具的功能&#xff0c;提供统一的 Python API 接口&am…...

PLC(电力载波通信)网络机制介绍

1. 概述 1.1 什么是PLC 电力载波通讯即PLC&#xff0c;是英文Power line Carrier的简称。 电力载波是电力系统特有的通信方式&#xff0c;电力载波通讯是指利用现有电力线&#xff0c;通过载波方式将模拟或数字信号进行高速传输的技术。最大特点是不需要重新架设网络&#xf…...

Qt监控系统远程回放/录像文件远程下载/录像文件打上水印/批量多线程极速下载

一、前言说明 在做这个功能的时候&#xff0c;着实费了点心思&#xff0c;好在之前做ffmpeg加密解密的时候&#xff0c;已经打通了极速加密保存文件&#xff0c;主要就是之前的类中新增了进度提示信号&#xff0c;比如当前已经处理到哪个position位置&#xff0c;发个信号出来…...

自学微信小程序的第八天

DAY8 1、使用动画API即可完成动画效果的制作,先通过wx.createAnimation()方法获取Animation实例,然后调用Animation实例的方法实现动画效果。 表40:wx.createAnimation()方法的常用选项 选项 类型 说明 duration number 动画持续时间,单位为毫秒,默认值为400毫秒 timing…...

【java】@Transactional导致@DS注解切换数据源失效

最近业务中出现了多商户多租户的逻辑&#xff0c;所以需要分库&#xff0c;项目框架使用了mybatisplus所以我们自然而然的选择了同是baomidou开发的dynamic.datasource来实现多数据源的切换。在使用初期程序运行都很好&#xff0c;但之后发现在调用com.baomidou.mybatisplus.ex…...

003 SpringBoot集成Kafka操作

4.SpringBoot集成Kafka 文章目录 4.SpringBoot集成Kafka1.入门示例2.yml完整配置3.关键配置注释说明1. 生产者优化参数2. 消费者可靠性配置3. 监听器高级特性4. 安全认证配置 4.配置验证方法5.不同场景配置模板场景1&#xff1a;高吞吐日志收集场景2&#xff1a;金融级事务消息…...

Android SystemUI开发(一)

frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUI.java frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java 关键文件 SystemUI 关键服务 简介 Dependency.class&#xff1a;处理系统依赖关系&#xff0c;提供资源或服…...

C#贪心算法

贪心算法&#xff1a;生活与代码中的 “最优选择大师” 在生活里&#xff0c;我们常常面临各种选择&#xff0c;都希望能做出最有利的决策。比如在超市大促销时&#xff0c;面对琳琅满目的商品&#xff0c;你总想用有限的预算买到价值最高的东西。贪心算法&#xff0c;就像是一…...

Vue程序下载

Vue是一个基于JavaScript&#xff08;JS&#xff09;实现的框架&#xff0c;想要使用它&#xff0c;就得先拿到Vue的js文件 Vue官网 Vue2&#xff1a;Vue.js Vue3&#xff1a;Vue.js - 渐进式 JavaScript 框架 | Vue.js 下载并安装vue.js 第一步&#xff1a;打开Vue2官网&a…...

【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;时间复杂度也就…...

机器学习决策树

一、香农公式 熵&#xff1a; 信息增益&#xff1a; 信息增益信息熵-条件熵 前者是初始信息熵大小&#xff0c;后者是因为条件加入后带来的确定性增加 信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度 信息增益越大说明影响越大 二、代码 ""&…...

Spring Boot + MyBatis 实现 RESTful API 的完整流程

后端开发&#xff1a;Spring Boot 快速开发实战 引言 在现代后端开发中&#xff0c;Spring Boot 因其轻量级、快速开发的特性而备受开发者青睐。本文将带你从零开始&#xff0c;使用 Spring Boot MyBatis 实现一个完整的 RESTful API&#xff0c;并深入探讨如何优雅地处理异…...

通过 ANSYS Discovery 进行 CFD 分析,增强工程设计

概括 工程师使用计算流体动力学 (CFD) 分析来研究和优化各种应用中的流体流动和传热分析。ANSYS Discovery 是一个用户友好的软件平台&#xff0c;使工程师能够轻松设置和解决 CFD 模型&#xff0c;并能够通知设计修改 在这篇博文中&#xff0c;我们将重点介绍在 Ansys Disc…...

家用可燃气体探测器——家庭燃气安全的坚实防线

随着社会的发展和变迁&#xff0c;天然气为我们的生活带来了诸多便利&#xff0c;无论是烹饪美食&#xff0c;还是温暖取暖&#xff0c;都离不开它的支持。然而&#xff0c;燃气安全隐患如影随形&#xff0c;一旦发生泄漏&#xff0c;可能引发爆炸、火灾等严重事故&#xff0c;…...

ListControl双击实现可编辑

为Edit Control控件添加丢失输入焦点事件,可见设为false 为List Control控件添加双击事件 控件和成员变量之间交换数据 CListCtrl ListPrint1; //列表输出 CEdit...

ave-form.vue 组件中 如何将产品名称发送给后端 ?

如何将产品名称发送给后端。 在这段代码中&#xff0c;产品名称&#xff08;productName&#xff09;的处理和发送主要发生在 save() 方法中。让我逐步分析&#xff1a; 产品ID的选择&#xff1a; <w-form-selectv-model"form.productId"label"涉及产品&q…...

DeepSeek行业应用实践报告-智灵动力【112页PPT全】

DeepSeek&#xff08;深度搜索&#xff09;近期引发广泛关注并成为众多企业/开发者争相接入的现象&#xff0c;主要源于其在技术突破、市场需求适配性及生态建设等方面的综合优势。以下是关键原因分析&#xff1a; 一、技术核心优势 开源与低成本 DeepSeek基于开源架构&#xf…...

【Markdown 语法简洁讲解】

Markdown 语法简洁语法讲解 什么是 Markdown1. 标题2. 列表3.文本样式4. 链接与图片5. 代码6. 表格7. 分割线8. 流程图9. 数学公式10. 快捷键11. 字体、字号与颜色 什么是 Markdown Markdown 是一种轻量级标记语言&#xff0c;通过简单的符号实现排版格式化&#xff0c;专注于…...

250301-OpenWebUI配置DeepSeek-火山方舟+硅基流动+联网搜索+推理显示

A. 最终效果 B. 火山方舟配置&#xff08;一定要点击添加&#xff09; C. 硅基流动配置&#xff08;最好要点击添加&#xff0c;否则会自动弹出所有模型&#xff09; D. 联网搜索配置 E. 推理过程显示 默认是没有下面的推理过程的显示的 设置步骤&#xff1a; 在Functions函…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...