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

0129_迭代器模式(Iterator)

迭代器模式(Iterator)

意图

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

UML 图

image

优点

  1. 简化访问接口:提供统一的遍历接口,简化客户端代码
  2. 封装内部结构:隐藏聚合对象的内部表示,提高安全性
  3. 支持多种遍历:可以在同一聚合上实现多种遍历方式
  4. 开闭原则:增加新的聚合类和迭代器类都很方便,无需修改现有代码
  5. 并行遍历:支持对同一聚合同时进行多个遍历

缺点

  1. 增加系统复杂度:需要定义额外的迭代器类,增加类的数量
  2. 性能开销:对于简单的聚合,使用迭代器可能比直接遍历效率低
  3. 可能破坏封装:某些迭代器实现可能需要访问聚合的内部细节
  4. 使用限制:某些语言(如Java)的迭代器是单向的,不能回退或重置
  5. 并发问题:在遍历过程中修改聚合可能导致并发异常

代码示例

以人类社交网络中的朋友关系为例:

1. 迭代器接口 (Iterator Interface)

// 迭代器接口
public interface FriendIterator {boolean hasNext();Person next();void reset();
}

2. 聚合接口 (Aggregate Interface)

// 聚合接口
public interface SocialNetwork {FriendIterator createIterator(String type);void addFriend(Person person);void removeFriend(Person person);
}

3. 具体聚合类 (Concrete Aggregate)

// 人类社交网络
public class HumanSocialNetwork implements SocialNetwork {private List<Person> friends = new ArrayList<>();private Map<String, List<Person>> friendsByCategory = new HashMap<>();@Overridepublic FriendIterator createIterator(String type) {switch (type) {case "close":return new CloseFriendsIterator(friends);case "recent":return new RecentFriendsIterator(friends);case "byInterest":return new InterestBasedIterator(friendsByCategory);default:return new AllFriendsIterator(friends);}}@Overridepublic void addFriend(Person person) {friends.add(person);// 按兴趣分类for (String interest : person.getInterests()) {friendsByCategory.computeIfAbsent(interest, k -> new ArrayList<>()).add(person);}}@Overridepublic void removeFriend(Person person) {friends.remove(person);// 从所有分类中移除for (List<Person> categoryFriends : friendsByCategory.values()) {categoryFriends.remove(person);}}public List<Person> getFriends() {return new ArrayList<>(friends); // 返回副本保护内部数据}
}

4. 具体迭代器实现 (Concrete Iterators)

// 所有朋友迭代器
public class AllFriendsIterator implements FriendIterator {private List<Person> friends;private int position;public AllFriendsIterator(List<Person> friends) {this.friends = new ArrayList<>(friends); // 保护性拷贝this.position = 0;}@Overridepublic boolean hasNext() {return position < friends.size();}@Overridepublic Person next() {if (!hasNext()) {throw new NoSuchElementException("没有更多朋友了");}return friends.get(position++);}@Overridepublic void reset() {position = 0;}
}// 亲密朋友迭代器(基于亲密程度)
public class CloseFriendsIterator implements FriendIterator {private List<Person> closeFriends;private int position;public CloseFriendsIterator(List<Person> allFriends) {this.closeFriends = allFriends.stream().filter(friend -> friend.getCloseness() >= 8) // 亲密程度8分以上.sorted((f1, f2) -> Integer.compare(f2.getCloseness(), f1.getCloseness())).collect(Collectors.toList());this.position = 0;}@Overridepublic boolean hasNext() {return position < closeFriends.size();}@Overridepublic Person next() {return closeFriends.get(position++);}@Overridepublic void reset() {position = 0;}
}// 最近添加的朋友迭代器
public class RecentFriendsIterator implements FriendIterator {private List<Person> recentFriends;private int position;public RecentFriendsIterator(List<Person> allFriends) {this.recentFriends = allFriends.stream().sorted((f1, f2) -> f2.getAddedDate().compareTo(f1.getAddedDate())).limit(10) // 最近10个朋友.collect(Collectors.toList());this.position = 0;}@Overridepublic boolean hasNext() {return position < recentFriends.size();}@Overridepublic Person next() {return recentFriends.get(position++);}@Overridepublic void reset() {position = 0;}
}// 基于兴趣的迭代器
public class InterestBasedIterator implements FriendIterator {private Map<String, List<Person>> friendsByCategory;private Iterator<Map.Entry<String, List<Person>>> categoryIterator;private Iterator<Person> currentCategoryIterator;public InterestBasedIterator(Map<String, List<Person>> friendsByCategory) {this.friendsByCategory = new HashMap<>(friendsByCategory);this.categoryIterator = this.friendsByCategory.entrySet().iterator();this.currentCategoryIterator = Collections.emptyIterator();}@Overridepublic boolean hasNext() {while (!currentCategoryIterator.hasNext() && categoryIterator.hasNext()) {Map.Entry<String, List<Person>> entry = categoryIterator.next();currentCategoryIterator = entry.getValue().iterator();}return currentCategoryIterator.hasNext();}@Overridepublic Person next() {if (!hasNext()) {throw new NoSuchElementException("没有更多朋友了");}return currentCategoryIterator.next();}@Overridepublic void reset() {categoryIterator = friendsByCategory.entrySet().iterator();currentCategoryIterator = Collections.emptyIterator();}
}

5. 人类实体类 (Person Entity)

// 人类实体
public class Person {private String name;private int closeness; // 亲密程度 1-10private LocalDate addedDate;private Set<String> interests;public Person(String name, int closeness, Set<String> interests) {this.name = name;this.closeness = closeness;this.addedDate = LocalDate.now();this.interests = new HashSet<>(interests);}// Getter方法public String getName() { return name; }public int getCloseness() { return closeness; }public LocalDate getAddedDate() { return addedDate; }public Set<String> getInterests() { return new HashSet<>(interests); }@Overridepublic String toString() {return name + " (亲密程度: " + closeness + ", 兴趣: " + interests + ")";}
}

6. 客户端代码

public class IteratorPatternDemo {public static void main(String[] args) {System.out.println("=== 迭代器模式演示 - 人类社交网络 ===\n");// 创建社交网络SocialNetwork socialNetwork = new HumanSocialNetwork();// 添加朋友socialNetwork.addFriend(new Person("张三", 9, Set.of("音乐", "运动")));socialNetwork.addFriend(new Person("李四", 7, Set.of("读书", "旅游")));socialNetwork.addFriend(new Person("王五", 10, Set.of("运动", "美食")));socialNetwork.addFriend(new Person("赵六", 6, Set.of("电影", "游戏")));socialNetwork.addFriend(new Person("钱七", 8, Set.of("音乐", "艺术")));System.out.println("1. 遍历所有朋友:");FriendIterator allIterator = socialNetwork.createIterator("all");while (allIterator.hasNext()) {System.out.println("   👥 " + allIterator.next());}System.out.println("\n2. 遍历亲密朋友 (亲密程度≥8):");FriendIterator closeIterator = socialNetwork.createIterator("close");while (closeIterator.hasNext()) {System.out.println("   ❤️ " + closeIterator.next());}System.out.println("\n3. 按兴趣分类遍历朋友:");FriendIterator interestIterator = socialNetwork.createIterator("byInterest");while (interestIterator.hasNext()) {System.out.println("   🎯 " + interestIterator.next());}System.out.println("\n4. 重置迭代器并重新遍历:");closeIterator.reset();while (closeIterator.hasNext()) {System.out.println("   🔄 " + closeIterator.next());}// 演示多种遍历方式同时进行System.out.println("\n5. 同时进行多种遍历:");FriendIterator iterator1 = socialNetwork.createIterator("all");FriendIterator iterator2 = socialNetwork.createIterator("close");System.out.println("   所有朋友中的第一个: " + iterator1.next());System.out.println("   亲密朋友中的第一个: " + iterator2.next());System.out.println("   所有朋友中的第二个: " + iterator1.next());}
}

在Java标准库中的应用

迭代器模式在Java标准库中的广泛应用:

  1. Collection框架
// Java集合框架中的迭代器
List<String> list = Arrays.asList("A", "B", "C");
Iterator<String> iterator = list.iterator(); // 创建迭代器while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);
}
  1. Map的keySet和entrySet
// Map的迭代器使用
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);// 遍历键
Iterator<String> keyIterator = map.keySet().iterator();
while (keyIterator.hasNext()) {System.out.println(keyIterator.next());
}// 遍历键值对
Iterator<Map.Entry<String, Integer>> entryIterator = map.entrySet().iterator();
while (entryIterator.hasNext()) {Map.Entry<String, Integer> entry = entryIterator.next();System.out.println(entry.getKey() + ": " + entry.getValue());
}
  1. 增强for循环(语法糖)
// 增强for循环底层使用迭代器
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
for (String name : names) { // 编译后使用iterator()System.out.println(name);
}
  1. 自定义迭代器实现
// 实现Iterable接口创建自定义迭代器
public class Range implements Iterable<Integer> {private final int start;private final int end;public Range(int start, int end) {this.start = start;this.end = end;}@Overridepublic Iterator<Integer> iterator() {return new RangeIterator();}private class RangeIterator implements Iterator<Integer> {private int current = start;@Overridepublic boolean hasNext() {return current <= end;}@Overridepublic Integer next() {if (!hasNext()) throw new NoSuchElementException();return current++;}}
}// 使用自定义迭代器
Range range = new Range(1, 5);
for (int num : range) {System.out.println(num); // 输出1,2,3,4,5
}

总结

迭代器模式通过提供统一的遍历接口,使得客户端代码能够以一致的方式访问各种聚合对象的元素,而无需关心其内部结构。在人类社交网络的例子中,我们可以看到如何为不同类型的朋友关系(亲密朋友、最近朋友、按兴趣分类等)提供不同的遍历方式。

模式核心思想:将遍历逻辑从聚合对象中分离出来,封装到专门的迭代器对象中,实现遍历与聚合的分离,提高系统的灵活性和可维护性。

适用场景

  • 需要为聚合对象提供多种遍历方式时
  • 需要统一遍历接口,屏蔽不同聚合的内部差异时
  • 需要支持对同一聚合的并行遍历时

通过迭代器模式,我们能够以更加灵活和可控的方式处理集合元素的遍历,特别是在复杂的社交网络或数据集合处理场景中。

相关文章:

0129_迭代器模式(Iterator)

迭代器模式(Iterator) 意图 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 UML 图优点简化访问接口:提供统一的遍历接口,简化客户端代码 封装内部结构:隐藏聚合对象的内部表示,提高安全性 支持多种遍历:可以在同一聚合上实现多种遍历方式 开…...

HJ7 取近似值

描述 对于给定的正实数 x,输出其四舍五入后的整数。更具体地说,若 x 的小数部分大于等于 0.5,则输出向上取整后的数;否则输出向下取整后的整数。 【提示】 不同编译器版本、不同系统环境对待实数的精度处理不同,我们建议您使用在线编译器进行调试。 输入描述: 输入一个小…...

读人形机器人13艺术领域

读人形机器人13艺术领域1. 艺术领域 1.1. 艺术始终是人类灵魂的深刻表达,是一面反映我们最深情感、思想和经历的镜子 1.2. 超越语言、文化和时间的界限,连接着不同世代的人 2. 机器人创作艺术和音乐 2.1. 如今,AI生成的艺术和音乐已不再是单纯的实验性产物,它们正逐渐成为创…...

活动报名:Voice First!Demo Day@Voice Agent Camp,9.22,上海丨超音速计划 2025

听腻了那些类比电影《Her》却无法真实落地的语音 AI 畅想?来 Demo Day@Voice Agent Camp,见证 「Voice First」理念下,真正创意和商业潜力兼具的初创项目。9 月 22 日下午,上海西岸数字谷,欢迎加入我们,一同重塑人机实时互动体验。demo 项目均来自「超音速计划 2025Voice…...

Windows计算器:现代C++实现的多功能计算工具

Windows计算器是一个用C++和C#编写的现代Windows应用程序,提供标准、科学和程序员计算功能,以及各种单位换算和货币转换功能,采用高精度算术运算确保计算准确性。项目标题与描述 Windows计算器是一个现代化的Windows应用程序,使用C++和C#编写,预装在Windows操作系统中。该…...

使用 PySide6/PyQt6 实现系统图标的展示与交互

在 Python 桌面应用开发中,系统图标的展示与选择是提升用户体验的重要环节。PySide6 和 PyQt6 作为 Qt 框架的 Python 绑定,提供了 QFileIconProvider 等核心类来实现这一功能。本文将以代码实例演示如何在两个框架中实现系统图标的可视化呈现与交互处理。 基础环境搭建与核心…...

如何让Java的线程池顺序执行任务 ?

一、基础概念 Java中的线程池本身并不提供内置的方式来保证任务的顺序执行的,因为线程池的设计目的是为了提高并发性能和效率,如果顺序执行的话,那就和单线程没区别了。 但是如果被问到想要实现这个功能该怎么做,有以下两种方式 1、使用单线程线程池 我们可以使用 SingleTh…...

Git 提交排除文件夹方法总结

在 Git 中排除某个文件夹(使其不被提交到远程仓库)有几种方法。以下是主要的解决方案:方法一:使用 .gitignore 文件(推荐) 这是最标准的方法,适用于大多数情况。创建或编辑 .gitignore 文件:# 如果还没有 .gitignore 文件 touch .gitignore在 .gitignore 中添加要排除的…...

如何在 Ubuntu24.04 TLS 上安装 Kubernetes 集群 - Antonie

0-先决条件 在开始安装之前,请确保您的环境满足以下先决条件:Ubuntu 24.04 LTS 系统。 至少 4GB RAM 或更多。 至少 2 个 CPU 内核。 有 40 GB 可用磁盘空间。1- 环境准备 集群规划k8s-node-1(Master):10.15.0.132 k8s-node-2(Worker):10.15.0.133 k8s-node-3(Worker)…...

Jmeter的插件开发

一、Jmeter的启动流程 在说启动流程之前我们先来看看Jmeter源码的各个重要的包:components—包含与协议无关的组件,如可视化、断言等等。 core —JMeter的核心代码,包括所有的核心接口和抽象类。 examples —演示采样器如何使用新bean框架的例子(开发插件前可以好好看看该包…...

Educational Codeforces Round 182 (Rated for Div. 2)

A. Cut the Array 题意:把数组分成三段,使得每段和模\(3\)后的值都相同或者都不相同。 \(n\)很小,暴力枚举分段就行了。点击查看代码 #include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int …...

java第二周课前提问

一、代码引入 public class Main {static void changeStr(String x) {x = "xyz";}static void changeArr(String[] strs) {for (int i = 0; i < strs.length; i++) {strs[i] = strs[i]+""+i;}}public static void main(String[] args) { String x = …...

java GC

java GC...

Redis最佳实践——性能优化技巧之监控与告警详解

一、监控体系构建1. 核心监控指标矩阵指标类别 关键指标 计算方式/说明 健康阈值(参考值)内存相关 used_memory INFO Memory 获取 不超过 maxmemory 的 80%mem_fragmentation_ratio 内存碎片率 = used_memory_rss / used_memory 1.0-1.5命中率 keyspace_hits INFO Stats 获取…...

week1

任务一,编码规范: 我在网上找到了华为公司C++编码规范,我摘下几点我觉得我应该注意的 1、程序块要采用缩进风格编写, 缩进的空格数为4个 2、不允许把多个短语句写在一行中, 即一行只写一条语句 3、 if、for、do、while、case、switch、default等语句自占一行, 且if、for、do…...

EF Core 与 MySQL:迁移和关系配置详解

EF Core 与 MySQL:迁移和关系配置详解 1. EF Core 中的关系类型 Entity Framework Core 支持三种主要的关系类型: 一对一关系 (One-to-One) 一个实体实例只与另一个实体实例相关联。例如:一个用户有一个用户资料。csharppublic class User {public int Id { get; set; }pub…...

《原子习惯》-读书笔记2

2025.09.15 Day2 1、目标和体系有什么不同?我最初是从“呆伯特漫画”的创作者斯科特亚当斯(Scott Adams)那里了解到两者的区别的。目标是关于你想要达到的结果,而体系是涉及导致这些结果的过程。2、争取每天都有进步是你走向成功唯一的方法。3、如果你想要得到更好的结果,那…...

CF1626D 题解

CF1626D 题解 貌似题解区没有这种解法。 题面 CF1626D Martial Arts Tournament - 洛谷 (luogu.com.cn) 思路 问题就是把 \(a\) 分成 \(3\) 个子集(可以为空),每两个子集里的数并不重复,把每个子集的大小补到 \(2^x\) 最少要补的数的个数。 先把 \(a\) 给排序,那么就可以转…...

Python 集合运算:并集、交集、差集全解析

在 Python 中,集合(set)是一种无序的、不包含重复元素的数据结构。集合提供了丰富的运算方法,包括并集、交集、差集等。这些运算在数据处理、数学计算和算法设计中非常实用。今天,就让我们一起深入学习 Python 集合的运算方法,并通过实例代码展示它们的使用。 一、集合的…...

第一周数据可视化作业

一、个人介绍 My name is Ou Qi. (🙂) 我性格阳光开朗,始终保持着对学习的热忱和对未知事物的探索欲,尤其从小就对数学有着浓厚兴趣 —— 课堂上会紧跟老师的思路深度思考,课后也常主动琢磨题型、尝试举一反三,在不断推导中把知识学扎实。 二、我的专业选择与学习历程 步…...

用 C++ + OpenCV + Tesseract 实现英文数字验证码识别

本文展示如何用 C++ 结合 OpenCV 做图像预处理,再调用 Tesseract OCR 识别验证码。适用于希望在高性能后端或本地服务里集成 OCR 的场景。方案包含: 更多内容访问ttocr.com或联系1436423940 环境与依赖安装 图像预处理(灰度、二值化、形态学去噪、放大) 使用 Tesseract API…...

java 第一节课课前提问

一、使用Java能编写的程序 企业级后端应用 Java 在企业级开发中占据重要地位,常被用于构建大型服务器端应用,如电商平台、银行交易系统、CRM(客户关系管理)系统等。这类应用通常需要处理高并发、复杂业务逻辑和海量数据,Java 凭借稳定的性能、丰富的企业级框架(如 Spring…...

二进制解码器、选通器和分配器

二进制解码器 3比特的二进制解码器可以由下图表示。每种组合方式对应着解码器的不同输出。3-8解码器可以用三个非门和三个与门构成解码器可以拼接起来组成更大的解码器,比如两个3-8解码器可以拼起来组成一个4-16解码器。选通器和分配器。 选通器 一个8选1的选通器如下图所示。…...

2025最新版 Photoshop软件免费下载安装完整教程(PS2025)超详细安装教程

Adobe Photoshop 2025 凭借升级的 AI 编辑功能、更优的图像处理效率,成为设计与摄影领域的热门工具。但不少用户在安装时,易因路径选择、安全软件拦截等问题卡壳。本教程聚焦安装全流程,从前期准备到后续配置,用清晰步骤帮你避开误区,顺利完成安装,快速解锁 PS 2025 的创…...

nac一键卸载软件脚本

将下面的代码保存为uninstall.sh: echo delete shit.app..need your root pwd; sudo rm -rf /Applications/dvc-manageproxy-exe.app; sudo rm -rf /Applications/LVSecurityAgent.app; echo script is fighting...; sudo chflags noschg /opt/LVUAAgentInstBaseRoot; sudo chf…...

交叉编译openharmony版本的openssh

sudo mkdir /systemsudo chmod 777 /system/export CC=aarch64-linux-gnu-gcc编译zlib./configure --prefix=/systemmake && make install 编译openssl./config linux-aarch64 --prefix=/system/ --openssldir=/system/etc/ssl --libdir=…...

为什么不建议在 Docker 中跑 MySQL

前言 今天我们来聊聊一个很有趣的话题:为什么我不建议在Docker中运行MySQL数据库? 有些小伙伴在工作中可能为了部署方便,习惯将所有组件都容器化,但数据库真的适合放在容器里吗? 今天就专门跟大家一起聊聊这个话题,希望对你会有所帮助。 一、容器化与数据库:天生的矛盾?…...

CFD

算例汇总 1、一维Sod激波管 2、二维平板 3、NACA0012 4、高马赫数喷流 5、双马赫反射 6、二维Riemann 7、二维Rayleigh-Taylor 8、TENO算例...

[MCP][05]Elicitation示例

Elicitation能让工具在关键时刻暂停执行,并向用户请求特定信息前言 如果你之前接触过LangGraph的"Human in the loop"概念,那么理解MCP的Elicitation机制就会容易很多。这两个功能非常相似,都是让AI在需要时停下来,礼貌地向人类寻求帮助或确认。 想象一下,当你正…...

Warsaw主题关闭导航条

\setbeamertemplate{headline}{}...

Python Socket网络编程(2)

进程:提供计算资源的单位 线程:真正工作的单位(cpu调度最小单元) GIL锁:全局解释器锁(是CPython解释器特有的,平时说的Python解释器一般都是CPython解释器,还有GPython等等) 让一个进程中同一时刻只能有一个线程可以被CPU调动。所以Python中应该是没有严格意义的多线程…...

PS2025安装包下载及PS2025安装包安装教程详细步骤(包含安装包下载链接)

在图像处理领域,Adobe Photoshop 一直占据着举足轻重的地位,而 PS 2025 更是汇聚前沿技术与实用功能,成为众多设计师与图像处理爱好者的得力工具。但初次安装这款软件,可能会因步骤繁杂、细节众多而让人感到棘手。别担心,本教程将以清晰、简洁的方式,带你一步步完成 PS 2…...

Nature Genetics | 本周最新文献速递

Multiancestry brain pQTL fine-mapping and integration with genome-wide association studies of 21 neurologic and psychiatric conditions 中文标题: 多祖先脑蛋白遗传调控解码!pQTL精细映射揭示神经精神疾病机制 关键词: 脑蛋白定量性状位点、精细映射、多祖先整合、…...

关于go里切片作为函数参数时是引用传递还是值传递

go语言中切片参数的值传递问题问题起因 写一道回溯算法题,把ans二维数组作为函数参数传入,想在函数里面,不停地append,最后返回ans 实际发现ans打印出来是空的,就很奇怪,因为我是事先分配好空间的,理论上不会发生扩容,底层数组是共用的,咋回事 func permute(nums []in…...

DRAN读写循环

DRAM读写循环 以一个8 * 8 的二维阵列为例子,假设部分存储单元为1,部分为0,现在要读写其中某一个cell的值。为了确定存储的位置,我们需要内存地址,为了传输内存地址,我们需要地址总线。8 * 8阵列一共有64个cell,我们需要6线地址总线,一共能表示64种二进制值。三根地址总…...

数据结构操作相关

堆 1、插入元素上滤每一次与父亲比较,满足大小就往上交换,直至不能往上为止。每次往上交换不会影响下面的性质2、删除/输出堆顶下滤假设大根堆,根节点换入末尾节点,每次先找出大儿子,若大儿子比自己大,则往下和他交换,直至不能往下为止。 3、建堆 1)初始为空,逐个inse…...

Neisbitt 不等式的证法

\(a,b,c\in R^+求证:\frac{a}{b+c}+\frac{b}{a+c}+\frac{c}{a+b}\geq\frac{3}{2}\) 证明: \(\because a,b,c\in R^+,\therefore\exists x,y,使得b=ax,c=ay\) \(\therefore LHS=\frac{1}{x+y}+\frac{x}{1+y}+\frac{y}{1+x}\) \(\therefore 令f(x,y)=\frac{1}{x+y}+\frac{x}{1+…...

端口转发神器Rinetd:轻量级安装与配置指南

什么是Rinetd? Rinetd(Redirection Internet Daemon)是一款轻量级的TCP端口转发工具,可以将来自一个IP地址和端口的连接转发到另一个IP地址和端口。它配置简单、资源占用少,是系统管理员和开发人员进行端口转发的理想选择。 Rinetd的主要特点轻量级:体积小,资源占用低 配…...

C语言中递归思想的应用

C语言中递归思想的应用 一、递归思想 在C语言中,函数是程序的基本单位,每个函数负责解决特定问题。但如果程序中出现n个相同的问题,就需要调用对应函数n次,这会导致程序冗长、可读性差。那么,有没有更简洁的解决方案呢? 答案是递归函数。递归函数并非万能,它更适用于解决…...

WITH RECURSIVE 递归公用表表达式(CTE)

生成一个从 1 到 12352 的连续数字序列SQL server SQL Server 对递归 CTE 有默认的递归深度限制(默认是 100),当递归次数超过这个限制时会报错。当远超默认限制时,需要在查询前使用 OPTION (MAXRECURSION 0) 来取消递归深度限制。WITH RECURSIVE num_sequence AS (SELECT 1…...

#java作业

1方法相关问题、 public class Main { static void changeStr(String x) { x = "xyz"; } static void changeArr(String[] strs) { for (int i = 0; i < strs.length; i++) { strs[i] = strs[i]+""+i; } } public static void main(String[] args) { …...

leetcode 3541. 找到频率最高的元音和辅音 便捷

leetcode 3541. 找到频率最高的元音和辅音 便捷pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !…...

匿名递归与不动点组合子

先贴上 CS61A Homework 3 Recursion, Tree Recursion 中的最后一道思考题题面: ​Q6: Anonymous FactorialThis question demonstrates that its possible to write recursive functions without assigning them a name in the global frame.The recursive factorial function…...

Markdown学习Day01

Markdown学习第一天 【【狂神说Java】Java零基础学习视频通俗易懂】https://www.bilibili.com/video/BV12J41137hu?p=6&vd_source=e3ba980d960d7d6c98e4872bba8cf225 Markdown学习 二级标题 字体 her hus hou KLI 引用选择不需要辩护。分割线插图超链接 学Java 表格年级 班…...

flutter compass结构代码分析

1.config文件夹:1.1assets.dart返回一个Assets类,包含activities和destinations两个静态属性。两个静态属性分别代表虚拟数据存放的路径。在assets文件夹下1.2 dependencies.dart使用provider绑定远程访问和本地访问所需要的数据 2.data文件夹2.1 repositoriesactivity文件夹a…...

25.9.15

应该都知道我退役了吧。 我对于这一段竞赛生涯呢,情感太复杂了。 (话说退役半年才回来写是不是有点晚了) 怎么说呢,这段竞赛让我有了一段快乐的时光,也让我彻底改变了。 想说很多,但是又说不出口。 先说说坏处吧 我的抑郁症可以说是被竞赛加深的,以至于我在初三下和高一…...

二十八、共享内存多处理器的基本概念

目录1. 核心定义2. 两种主要的共享内存架构a) 均匀内存访问b) 非均匀内存访问3. 共享内存多处理器的核心挑战与解决方案a) 缓存一致性b) 内存一致性4. 编程模型与同步5. 优势与劣势优势:劣势:总结共享内存多处理器是多处理器系统中最常见和直观的一种架构,也是现代多核CPU设…...

详细介绍:【ARMv7】系统复位上电后的程序执行过程

详细介绍:【ARMv7】系统复位上电后的程序执行过程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospac…...

C#高级语法

https://www.cnblogs.com/NotEnough/p/7426853.html https://juejin.cn/post/7100033147101773831...

配置Maven

IDEA配置Maven原文链接:https://blog.csdn.net/leah126/article/details/132020904 一、Maven下载 首先我们进入maven官方网站,进入网页后,点击Download去下载。下载免安装版,解压即可,解压至磁盘任意目录,尽量不要取中文名如下图: 二、配置Maven环境变量 打开cmd命令行,…...