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;
}

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

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

相关文章

​ArcGIS Pro和ArcGIS的10大区别

本文来源&#xff1a;水经注GIS公众号 如果你经常使用ArcGIS 进行制图和分析&#xff0c;那么你一定听说过ArcGIS Pro&#xff0c;这款软件是Esri未来主打的一款桌面GIS软件&#xff0c;那么这款软件和ArcGIS相比有什么不同呢&#xff0c;这里为你列举了两款软件的10大区别&am…

QScopedPointer的了解

QT 智能指针 QPointer QScopedPointer QSharedPointer QWeakPointer QSharedDataPointer 隐式共享 显示共享-CSDN博客 本文摘录自上面的文章 其类似于C11中的unique_ptr&#xff0c;用于管理动态分配的对象的独占所有权&#xff0c;即同一时间只能有一个QScopedPointer指向该…

Docker 安装 Nacos 教程

Nacos 是一个易于使用的平台&#xff0c;用于服务发现和配置管理。它支持服务的注册与发现&#xff0c;同时提供动态配置管理功能。本文将介绍如何使用 Docker 快速安装 Nacos&#xff0c;并提供相应的配置文件 standalone-mysql-5.7.yaml 用于设置 Nacos 与 MySQL 的集成。 参…

文本分类场景下微调BERT

How to Fine-Tune BERT for Text Classification 论文《How to Fine-Tune BERT for Text Classification?》是2019年发表的一篇论文。这篇文章做了一些实验来分析了如何在文本分类场景下微调BERT&#xff0c;是后面网上讨论如何微调BERT时经常提到的论文。 结论与思路 先来看…

Vue跨域问题、Vue配置开发环境代理服务、集成Axios发送Ajax请求、集成vue-resource发送Ajax请求

目录 1. Ajax请求服务介绍2. axios的安装3. Vue跨域问题介绍和解决方案4. 使用vue-cli配置开发环境代理服务4.1 简单配置4.2 复杂配置4.3 二次封装 5. 集成vue-resource发送Ajax请求 1. Ajax请求服务介绍 xhr: new XHLHttpRequest().open()/send()。偏向底层JQuery: 对xhr进行…

Sklearn的datasets模块与自带数据集介绍

datasets 模块 用 dir() 函数查看 datasets 模块的所有属性和函数 import sklearn.datasets as datasets# 列出 sklearn.datasets 模块中的所有属性和函数 print(dir(datasets)) datasets 模块下的数据集有三种类型&#xff1a; &#xff08;1&#xff09;load系列的经典数…

Sqoop 数据迁移

Sqoop 数据迁移 一、Sqoop 概述二、Sqoop 优势三、Sqoop 的架构与工作机制四、Sqoop Import 流程五、Sqoop Export 流程六、Sqoop 安装部署6.1 下载解压6.2 修改 Sqoop 配置文件6.3 配置 Sqoop 环境变量6.4 添加 MySQL 驱动包6.5 测试运行 Sqoop6.5.1 查看Sqoop命令语法6.5.2 测…

Vue 中 计算属性与侦听属性的使用与介绍

Vue 中 计算属性与侦听属性的使用与介绍 计算属性 - computed 计算属性是一种特殊的属性&#xff0c;它依赖于其他属性&#xff0c;并返回一个新的值。当依赖的属性发生变化时&#xff0c;计算属性会重新求值。 计算属性的语法如下&#xff1a; computed: {// 计算属性名: …

【数学建模】2024数学建模国赛经验分享

文章目录 一、关于我二、我的数模历程三、经验总结&#xff1a; 一、关于我 我的CSDN主页&#xff1a;https://gxdxyl.blog.csdn.net/ 2020年7月&#xff08;大二结束的暑假&#xff09;开始在CSDN写作&#xff1a; 阿里云博客专家&#xff1a; 接触的领域挺多的&#xff…

摩尔投票算法--169. 多数元素

169. 多数元素 普通方法-借助map计数 class Solution { public:int majorityElement(vector<int>& nums) {map<int,int> mp;for(int num :nums){mp[num];}for(auto &a :mp){if(a.second>nums.size()/2){return a.first;}}return 0;} }; 进阶&#xff…

【Linux】常用指令(中)(附带基础指令的详细讲解、Linux的一些附加知识)

文章目录 前言1. Linux基础常用指令1.1 通配符 "*"1.2 man指令&#xff08;重要&#xff09;1.2.1 man指令的语法 1.3 何为"指令"&#xff1f;(附带知识)1.4 echo指令1.5 cat指令1.6 Linux下一切皆文件&#xff01;1.6.1 ">" 输出重定向1.6.2…

【基础知识复习 - 随机练习题】

问题 1&#xff1a;在软件生命周期模型中&#xff0c;哪一个模型强调了开发过程的迭代性和反馈&#xff1f; A. 瀑布模型 B. V模型 C. 敏捷模型 D. 原型模型 答案&#xff1a;C. 敏捷模型 解析&#xff1a;敏捷模型强调迭代开发和反馈&#xff0c;允许在每个迭代周期中进行调…

浅谈C#之线程锁

一、基本介绍 锁是一种同步机制&#xff0c;用于控制多个线程对共享资源的访问。当一个线程获得了锁时&#xff0c;其他线程将被阻塞&#xff0c;直到该线程释放了锁。 在并发编程中&#xff0c;多个线程同时访问共享资源可能导致数据竞争和不确定的行为。锁可以确保在任意时刻…

springboot提升-多数据源配置

文章目录 1. 添加依赖2. 配置数据源示例配置&#xff1a; 3. 创建数据源 Bean4. 创建动态数据源5. 配置 MyBatis SqlSessionFactory6. 在业务代码中使用注意事项 在 Spring Boot 中配置 MyBatis 以支持多数据源涉及几个关键步骤&#xff0c;包括配置数据源、集成 MyBatis 以及动…

Qt篇——Qt使用C++获取Windows电脑上所有外接设备的名称、物理端口位置等信息

我之前有发过一篇文章《Qt篇——获取Windows系统上插入的串口设备的物理序号》&#xff0c;文章中主要获取的是插入的USB串口设备的物理序号&#xff1b;而本篇文章则进行拓展&#xff0c;可以获取所有外接设备的相关信息&#xff08;比如USB摄像头、USB蓝牙、USB网卡、其它一些…

Android 蓝牙三方和动态权限三方

记录一下最近用到的简单的框架 蓝牙 FastBle&#xff1a;Android BLE通信库的介绍与高级用法 - 简书 https://github.com/Jasonchenlijian/FastBle 动态权限: GitHub - googlesamples/easypermissions: Simplify Android M system permissions 位置权限举例,arrayOf中多…

Spring 源码解读:使用FactoryBean创建复杂对象的实现

引言 在Spring框架中&#xff0c;FactoryBean是一个特殊的Bean&#xff0c;它允许开发者通过实现FactoryBean接口来控制Bean的创建过程&#xff0c;特别适用于创建复杂对象。FactoryBean可以将复杂对象的创建逻辑与业务逻辑分离&#xff0c;提供更高的灵活性和可扩展性。在本篇…

分布式技术概览

文章目录 分布式技术1. 分布式数据库&#xff08;Distributed Databases&#xff09;2. 分布式文件系统&#xff08;Distributed File Systems&#xff09;3. 分布式哈希表&#xff08;Distributed Hash Tables, DHTs&#xff09;4. 分布式缓存&#xff08;Distributed Caching…

代码随想录打卡Day28

今天的题目还是感觉有难度&#xff0c;前三道题都想不出来思路&#xff0c;直接看讲解去了。。。贪心的难题真的好难想出来。 122.买卖股票的最佳时机II 这道题用贪心解很巧妙。涉及到一个数学技巧&#xff0c;从第i天买入&#xff0c;第j天卖出&#xff0c;所获得的利润为pr…

面试必问:Java 类加载过程

java 类加载过程主要分为加载、链接和初始化三个阶段&#xff0c;六个关键步骤&#xff1a;加载、验证、准备、解析、初始化。 加载阶段&#xff08;Loading&#xff09; 加载时类加载的第一个过程&#xff0c;在这个阶段&#xff0c;将完成以下三件事情&#xff1a; 1&#…