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

19章 泛型

1.修改程序清单19-1中的GenericStack类,使用数组而不是ArrayList来实现它。你应该在给栈添加新元素之前检查数组的大小如果数组满了,就创建一个新数组。该数组是当前数组大小的两倍,然后将当前数组的元素复制到新数组中。

public class GenericStack<E> {private E[] arr = (E[]) new Object[16];private int n = 0;public int getSize() {return n;}public E peek() {return arr[n - 1];}public void push(E o) {if (n == arr.length) {E[] tmp = (E[]) new Object[arr.length << 1];System.arraycopy(arr, 0, tmp, 0, arr.length);arr = tmp;}arr[n++] = o;}public E pop() {if (n == 0) return null;return arr[--n];}public boolean isEmpty() {return n == 0;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder("stack: [");for (E e : arr)sb.append(e).append(',').append(' ');sb.deleteCharAt(sb.length() - 1);sb.setCharAt(sb.length() - 1, ']');return sb.toString();}
}

2.程序清单19-1中,GenericStack是使用组合实现的。定义一个新的继承自ArrayList的栈类。画出UML类图,然后实现GenericStack。编写一个测试程序,提示用户输入5个字符串,然后以逆序显示它们。

public class GenericStack<E> extends ArrayList<E> {public int getSize() {return super.size();}public E peek() {return super.getLast();}public void push(E o) {super.add(o);}public E pop() {if (super.isEmpty()) return null;return super.removeLast();}public boolean isEmpty() {return super.isEmpty();}@Overridepublic String toString() {return "stack: " + super.toString();}public static void main(String[] args) {GenericStack<String> strings = new GenericStack<>();System.out.println("请输入5个字符串:");Scanner scanner = new Scanner(System.in);for (int i = 0; i < 5; i++)strings.add(scanner.next());scanner.close();for (int i = 0; i < 5; i++)System.out.println(strings.pop());}
}

3.编写以下方法,返回一个新的ArrayList。该新列表中包含来自原列表中的不重复元素。

public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) {return new ArrayList<E>(new HashSet<>(list));
}

4.为线性搜索实现以下泛型方法。

public static <E extends Comparable<E>> int linearSearch(E[] list, E key) {for (int i = 0; i < list.length; i++)if (list[i].compareTo(key) == 0)return i;return -1;
}

5.实现下面的方法,返回数组中的最大元素。编写一个测试程序,提示用户输入10个整数,调用该方法找到最大数并显示。

public class Test {public static <E extends Comparable<E>> E max(E[] list) {E m = list[0];for (int i = 1; i < list.length; i++)if (list[i].compareTo(m) > 0)m = list[i];return m;}public static void main(String[] args) {Integer[] integers = new Integer[10];Scanner scanner = new Scanner(System.in);for (int i = 0; i < 10; i++) {integers[i]=scanner.nextInt();}scanner.close();System.out.println(max(integers));}
}

6.编写一个泛型方法,返回二维数组中的最大元素。

public static <E extends Comparable<E>> E max(E[][] list) {E m = max(list[0]); // 使用第5题的结果for (int i = 1; i < list.length; i++) {E t = max(list[i]);if (t.compareTo(m) > 0)m = t;}return m;
}

7.使用二分查找法实现下面的方法。

public static <E extends Comparable<E>> int binarySearch(E[] list, E key) {int i = 0, j = list.length - 1;while (i <= j) {int m = (i + j) >> 1, compareRes = list[m].compareTo(key);if (compareRes == 0)return m;if (compareRes > 0)j = m - 1;elsei = m + 1;}return -1;
}

8.编写以下方法,打乱ArrayList

public static <E> void shuffle(ArrayList<E> list) {Random random = new Random();for (int i = 0; i < list.size(); i++) {int j = random.nextInt();E tmp = list.get(i);list.set(i, list.get(j));list.set(j, tmp);}
}

9.编写以下方法,对ArrayList排序。

public class Test {public static <E extends Comparable<E>> void sort(ArrayList<E> list) {for (int i = 0; i < list.size() - 1; i++) {int k = i;for (int j = i + 1; j < list.size(); j++)if (list.get(j).compareTo(list.get(k)) < 0)k = j;if (k != i) {E tmp = list.get(i);list.set(i, list.get(k));list.set(k, tmp);}}}public static void main(String[] args) {ArrayList<Integer> list=new ArrayList<>(10);Scanner scanner = new Scanner(System.in);for (int i = 0; i < 10; i++)list.add(scanner.nextInt());sort(list);System.out.println(list);}
}

10.编写以下方法,返回ArrayList中的最大元素。

public static <E extends Comparable<E>> E max(ArrayList<E> list) {if (list.isEmpty()) return null;E m = list.getFirst();for (int i = 0; i < list.size(); i++)if (m.compareTo(list.get(i)) < 0)m = list.get(i);return m;
}

相关文章:

19章 泛型

1.修改程序清单19-1中的GenericStack类&#xff0c;使用数组而不是ArrayList来实现它。你应该在给栈添加新元素之前检查数组的大小如果数组满了&#xff0c;就创建一个新数组。该数组是当前数组大小的两倍&#xff0c;然后将当前数组的元素复制到新数组中。 public class Gene…...

基于python+django+mysql+Nanodet检测模型的水稻虫害检测系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…...

计算机网络27、28——Linux命令1、2

1、虚拟机网络前方路径内容 用户名机器名&#xff1a;/$ $表示普通用户&#xff0c;#表示root用户 2、Linux不分盘&#xff0c;都是绝对路径 /表示根目录&#xff0c;表示计算机文件夹下 ~是当前用户的家&#xff0c;表示home文件夹下自己的文件夹 3、bin文件夹下的是可执…...

【Python深度学习】逆强化学习(IRL):通俗揭开学习背后的奥秘

逆强化学习:揭开学习背后的奥秘 1. 引言 当我们谈论人工智能(AI)时,很多人第一时间会想到强化学习。强化学习是一种让智能体通过与环境的互动,逐渐学习到如何做出最优决策的学习方法。然而,有一种更加神奇的学习方式叫做 逆强化学习(Inverse Reinforcement Learning,…...

Linux:五种IO模型

1&#xff1a;五种IO模型 1&#xff1a;阻塞IO 阻塞IO: 在内核将数据准备好之前,系统调用会一直等待.所有的套接字,默认 都是阻塞方式。 2&#xff1a;非阻塞 IO 非阻塞 IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK 错误码。 非阻塞 IO 往往需…...

ansible企业实战

ansible最佳实践 优化ansible速度 开启SSH长连接 修改 /etc/ansible/ansible.cfg里面的参数 ssh_args -C -o ControlMasterauto -o ControlPersist5d ControlPersist5d这个参数是设置整个长连接保持时间设置为5天&#xff0c;如果开启&#xff0c;通过SSH连接过的设备都会…...

面向对象程序设计之模板进阶(C++)

在之前我出过一篇博客介绍了模版的初阶:面向对象程序设计(C)模版初阶&#xff0c;接下来我们将进行模版的进阶学习&#xff0c;介绍关于更多模版的知识 1.非类型模版参数 模板参数分类类型形参与非类型形参 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或…...

电巢科技携Ecosmos元宇宙产品亮相第25届中国光博会

第25届中国国际光电博览会&#xff08;“CIOE中国光博会”&#xff09;今日在深圳国际会展中心盛大开幕。本届博览会以“光电引领未来&#xff0c;驱动应用创新”为主题&#xff0c;吸引了全球超过3700家优质光电企业参展&#xff0c;展示了光电产业的最新成果和前沿技术。 电…...

Redis 入门 - 收官

《Redis 入门》系列文章总算完成了&#xff0c;希望这个系列文章可以想入门或刚入门的同学提供帮助&#xff0c;希望能让你形成学习Redis系统性概念。 当时为什么要写这个系列文章&#xff0c;是因为我自己就是迷迷糊糊一路踩坑走过来的&#xff0c;我踩完的坑就踩完了&#x…...

Windows技术栈企业基础底座(1)-为基于Windows的Nginx安装证书

企业的基础环境是一个组织的信息化数字化底座。传统企业基础环境多种系统&#xff0c;应用交杂&#xff0c;多种技术栈使得深入运维成本极大&#xff0c;且人员知识技能较难复用&#xff0c;造成资源浪费。本系列旨在尝试推动这一理念, 建立Windows, 或linux聚焦的技术栈的企业…...

ThreeJS入门(002):学习思维路径

查看本专栏目录 - 本文是第 002篇入门文章 文章目录 如何使用这个思维导图 Three.js 学习思维导图可以帮助你系统地了解 Three.js 的各个组成部分及其关系。下面是一个简化的 Three.js 学习路径思维导图概述&#xff0c;它包含了学习 Three.js 的主要概念和组件。你可以根据这个…...

基于ssm+vue+uniapp的新生报到系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…...

掌握 JavaScript ES6+:现代编程技巧与模块化实践

掌握 JavaScript ES6&#xff1a;现代编程技巧与模块化实践 一 . 变量声明 let二 . 声明常量 const三 . 模板字符串四 . 函数的参数默认值五 . 箭头函数六 . 对象初始化七 . 解构7.1 接收 JSON 对象7.2 接收数组 八 . 延展操作符九 . 导入和导出9.1 方式一9.2 方式二 这篇文章我…...

AttackGen - AI 网络安全事件响应测试工具,附下载链接

为了提高我们团队在安全活动中的响应效率&#xff0c;我关注到了一款叫 AttackGen 的工具&#xff0c;我们需要的是一个既能快速生成场景又能准确反映现实威胁的工具。 在红蓝对抗中&#xff0c;我们经常要模拟各种攻击场景&#xff0c;以测试我们的防御水平。这不仅仅是为了“…...

CAD2020安装方法

文章目录 下载安装包打开压缩包打开文件夹打开CAD2020文件夹双击运行Setup.exe点击安装选择我接受 点击下一步路径默认点击安装等待加载完成安装完成点击立即启动点击OK点击输入序列号点击我同意点击激活输入序列号和 产品钥密点击下一步选择我具有 Autodesk 提供的激活码以管理…...

ubuntu安装mongodb实操学习

一、系统环境 ubuntu 22.04 寻找合适的仓库 经过浏览器里搜索MongoDB Repositories发现这个目录下面有完整的安装包 二、添加到apt&#xff0c;并安装 1、wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | tee /etc/apt/trusted.gpg.d/server-6.0.asc 获取公…...

RabbitMQ 基础入门

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 前言 1. 重要概念 1.1 Publisher 1.2 Message 1.3 Exchange 1.4 BindingKey 1.5 Routingkey 1.6 Queue 1.7 Consumer 1.8 Connection 1.9 Channel 1.10 Virtual Host 1.11Broker 2. RabbitMQ…...

Unity 特殊文件夹

文件夹名称Assets资产Editor编辑器Editor default resources编辑器资源Gizmos辅助图标Plugins插件Resources资源Standard Assets标准资产StreamingAssets流资产PersistentDataPath持久数据 Editor 编辑器文件夹 这个文件夹是专门用来做编辑器级别功能的&#xff0c;比如一些辅…...

Monster Sound FX Pack 2 怪物恶魔野兽声效包

这是受最新电影和游戏启发而创作的一系列超凡怪兽音效中的第二卷。Monster Sound FX Pack 2 包含精心设计的声音,充满个性,为听众带来新的体验。这些声音经过专业设计,是严肃的声音设计师和游戏开发者的必备品! 发现声音非常适合龙、野兽、外星人、兽人、地精、巨人、巨魔、…...

linux常用环境配置

nvm 用于管理不同版本node node版本管理工具 nvm install 18 #安装 nvm uninstall 18 #卸载 nvm use 18 #使用 nvm ls #查看当前有的node版本 nvm ls-remote #列出所有可用的node版本pyenv 在linux中管理多版本 python 常用命令&#xff1a; pyenv install 3.8.…...

如何彻底释放惠普OMEN游戏本性能:终极免费硬件控制工具指南

如何彻底释放惠普OMEN游戏本性能&#xff1a;终极免费硬件控制工具指南 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度&#xff0c;自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 还在为惠普OMEN游戏本官方软件臃肿…...

进化智能体实战:从基因编码到种群优化的完整实现指南

1. 项目概述&#xff1a;从蓝图到智能体&#xff0c;一次开源协作的深度实践最近在开源社区里&#xff0c;一个名为planck-lab/hermes-evolving-agents-public-blueprint的项目引起了我的注意。乍一看这个标题&#xff0c;它像是一个技术蓝图或公开的设计文档&#xff0c;但深入…...

基于CircuitPython与NeoPixel的桌面俄罗斯方块游戏机DIY全攻略

1. 项目概述与核心思路几年前&#xff0c;我在麻省理工学院&#xff08;MIT&#xff09;的校园里第一次看到那座著名的“绿楼”&#xff08;Green Building&#xff09;外墙上的巨型俄罗斯方块游戏时&#xff0c;就被深深震撼了。那不仅仅是一个游戏&#xff0c;更是一种将冰冷…...

UE5 产品三维交互展示 创意实现

1. UE5产品三维交互展示的核心价值 想象一下&#xff0c;你正在向客户展示一款全新的无人机产品。传统的二维图片和视频已经无法满足需求&#xff0c;客户希望全方位了解产品细节&#xff0c;甚至能亲手"拆解"查看内部构造。这正是UE5三维交互展示的用武之地。 UE5…...

Qt Scene Graph渲染管线深度解析:从QML到GPU像素的奇幻之旅

揭开Qt Quick高性能渲染的黑盒&#xff0c;掌握60fps丝滑界面的核心秘密一、为什么Scene Graph是Qt Quick的灵魂&#xff1f; 当你用QML写一个流畅的动画界面&#xff0c;轻松跑到60fps&#xff0c;有没有想过背后的渲染引擎到底做了什么&#xff1f;传统的QWidget走的是CPU软件…...

AI智能体任务编排框架:从概念到实战的Mission Control指南

1. 项目概述&#xff1a;为AI智能体打造一个“任务控制中心”最近在折腾AI智能体&#xff08;Agent&#xff09;的开发&#xff0c;发现一个挺普遍的问题&#xff1a;当你想让多个智能体协同工作&#xff0c;或者想让单个智能体执行一系列复杂、有依赖关系的任务时&#xff0c;…...

探索Windows HEIC缩略图:跨平台照片管理深度解析

探索Windows HEIC缩略图&#xff1a;跨平台照片管理深度解析 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails Windows HEIC缩略图…...

别再手动算位宽了!Vivado FIR IP核的位宽计算逻辑与配置避坑指南

Vivado FIR IP核位宽计算实战&#xff1a;从黑盒解析到精准配置 在FPGA数字信号处理领域&#xff0c;FIR滤波器作为基础构建模块&#xff0c;其性能表现直接影响整个系统的信号处理质量。而位宽配置这个看似简单的参数&#xff0c;往往成为项目后期调试阶段的"隐形杀手&qu…...

Hitboxer终极指南:专业级游戏键盘重映射与SOCD清理工具完全教程

Hitboxer终极指南&#xff1a;专业级游戏键盘重映射与SOCD清理工具完全教程 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd Hitboxer是一款专为竞技游戏玩家设计的专业级键盘按键重映射和SOCD清理工具&#xff…...

如何快速解密网易云NCM文件:终极免费转换工具指南

如何快速解密网易云NCM文件&#xff1a;终极免费转换工具指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否在网易云音乐下载了喜欢的歌曲&#xff0c…...