数据结构(Java)——迭代器和列表的实例

感谢Java软件结构与数据结构 John Lewis Joseph chase 著 金名译

0. 迭代器关键概念(补充理解)

【1】迭代器是一个对象,它提供了一种依次访问集合中每个元素的方式。
【2】经常把集合定义为Iterable的,说明需要时可以提供一个迭代器。
【3】迭代器可选方法remove使得它可以remove一个元素,而无需再遍历集合。
【4】大多数迭代器是fail-fast的,当迭代器人在使用之时,如果修改集合,将抛出一个异常。
【5】不能假设迭代器访问元素的顺序,除非显式声明。
【6】迭代器往往实现为它所属的集合的内部类。
【7】迭代器检查修改技术,以确保与集合的修改计数保持一致。
【8】for-each循环只能够用于实现了iterator接口的集合中,
【9】如果不是要处理集合中的所有元素或者如果要使用迭代器的remove方法,可以使用显式迭代器而不是for-each循环。
【10】如果底层集合不是由迭代器本身进行修改的,fail-fast迭代器将快速而清晰地发生失败。
【11】fail-fast的实现:在后继的操作中,迭代器会通知集合的修改计数,确保该值不会被修改。如果改了,迭代器就会抛出ConcurrentModificationException异常。

2. Java集合API列表

Java集合API提供的列表类主要是支持索引列表。在一定程度上,这些类同无序列表是重叠的。JavaAPI中没有实现事实上的有序列表。
【1】ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
【2】对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
【3】对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
ArrayList和LinkedList都实现了java.util.List接口。

java.util.List接口的一些方法

3. 使用无序列表:学习计划

Course.java

package ds.java.ch06;import java.io.Serializable;/** * @author LbZhang* @version 创建时间:2015年11月18日 上午10:19:57 * @description 类说明*/
public class Course implements Serializable{private String prefix;private int number;private String title;private String grade;public Course(String prefix, int number, String title, String grade) {super();this.prefix = prefix;this.number = number;this.title = title;if(grade==null){this.grade = "";}else{this.grade = grade;}}public Course(String prefix, int number, String title){this(prefix, number, title, "");}public String getPrefix() {return prefix;}public void setPrefix(String prefix) {this.prefix = prefix;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}/*** Returns true if this course has been taken  * * @return true if this course has been taken and false otherwise*/public boolean taken(){return !grade.equals("");}public boolean equals(Object other){boolean result = false;if (other instanceof Course){Course otherCourse = (Course) other;if (prefix.equals(otherCourse.getPrefix()) &&number == otherCourse.getNumber())result = true;}return result;}public String toString(){String result = prefix + " " + number + ": " + title;if (!grade.equals(""))result += "  [" + grade + "]";return result;}}

ProgramOfStudy.java

package ds.java.ch06;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;/*** @author LbZhang* @version 创建时间:2015年11月17日 上午11:30:41* @description 类说明*/
public class ProgramOfStudy implements Iterable<Course>, Serializable {private List<Course> list;public ProgramOfStudy() {list = new LinkedList<Course>();}public void addCourse(Course course) {if (course != null)list.add(course);}public Course find(String prefix, int number) {for (Course course : list)if (prefix.equals(course.getPrefix())&& number == course.getNumber())return course;return null;}/*** 在某个元素之后添加元素* @param target* @param newCourse*/public void addCourseAfter(Course target, Course newCourse) {if (target == null || newCourse == null)return;int targetIndex = list.indexOf(target);//获取索引if (targetIndex != -1)list.add(targetIndex + 1, newCourse);}public void replace(Course target, Course newCourse) {if (target == null || newCourse == null)return;int targetIndex = list.indexOf(target);if (targetIndex != -1)list.set(targetIndex, newCourse);}public String toString() {String result = "";for (Course course : list)result += course + "\n";return result;}public Iterator<Course> iterator() {return list.iterator();}public void save(String fileName) throws IOException {FileOutputStream fos = new FileOutputStream(fileName);ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(this);oos.flush();oos.close();}public static ProgramOfStudy load(String fileName) throws IOException,ClassNotFoundException {FileInputStream fis = new FileInputStream(fileName);ObjectInputStream ois = new ObjectInputStream(fis);ProgramOfStudy pos = (ProgramOfStudy) ois.readObject();System.out.println(pos);ois.close();return pos;}}

POSTester.java

package ds.java.ch06;
import java.io.IOException;/*** @author LbZhang* @version 创建时间:2015年11月18日 上午9:46:48* @description 类说明*/
public class POSTester {public static void main(String[] args) throws IOException,ClassNotFoundException {ProgramOfStudy pos = new ProgramOfStudy();pos.addCourse(new Course("CS", 101, "Introduction to Programming", "A-"));pos.addCourse(new Course("ARCH", 305, "Building Analysis", "A"));pos.addCourse(new Course("GER", 210, "Intermediate German"));pos.addCourse(new Course("CS", 320, "Computer Architecture"));pos.addCourse(new Course("THE", 201, "The Theatre Experience"));Course arch = pos.find("CS", 320);pos.addCourseAfter(arch, new Course("CS", 321, "Operating Systems"));Course theatre = pos.find("THE", 201);theatre.setGrade("A-");Course german = pos.find("GER", 210);pos.replace(german, new Course("FRE", 110, "Beginning French", "B+"));System.out.println(pos);pos.save("ProgramOfStudy");
//      pos = pos.load("ProgramOfStudy");
//      System.out.println(pos);}}

4. 约瑟夫问题

4.1 索引列表实现

package ds.java.ch06;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** @author LbZhang* @version 创建时间:2015年11月18日 上午11:18:20* @description 约瑟夫问题* */
public class Josephus {public static void main(String[] args) {int numPeople, skip, targetIndex;List<String> list = new ArrayList<String>();Scanner in = new Scanner(System.in);// get the initial number of soldiersSystem.out.print("Enter the number of soldiers: ");numPeople = in.nextInt();in.nextLine();// get the number of soldiers to skipSystem.out.print("Enter the number of soldiers to skip: ");skip = in.nextInt();if(numPeople<skip){System.out.println("**不能进行约瑟夫环**");return ;}// load the initial list of soldiersfor (int count = 1; count <= numPeople; count++) {list.add("Soldier " + count);}//now location indextargetIndex = skip;System.out.println("The order is: ");// Treating the list as circular, remove every nth element// until the list is emptywhile (list.size()>2) {System.out.println(list.remove(targetIndex));if (list.size() > 0)targetIndex = (targetIndex + skip) % list.size();}System.out.println(list);}}

4.2 数组实现

package ds.java.ch06;import java.util.Scanner;/*** @author LbZhang* @version 创建时间:2015年11月18日 下午12:23:55* @description 类说明*/
public class MyJosephus {private int total;// 总人数private int numCount;// 从当前开始第几个出列private int beginNum;// 开始编号private int[] solider;// 士兵队列private int[] outSequence;// 出队次序public MyJosephus(int total, int numCount, int beginNum) {super();this.total = total;this.numCount = numCount;this.beginNum = beginNum;this.solider = new int[total];// 初始化for (int i = 0; i < solider.length; i++) {solider[i] = i;}this.outSequence = new int[total];}public void exec() {int counter = 0;// /标价变量int i = this.beginNum;int j = 0;int killperson = 0;while (true) {if (solider[i] != -1) {// pserson[i]的值是-1,代表出环// 没有出环,计数器加1counter++;// 判定是否数目达到numCountif ((counter) % numCount == 0) {outSequence[j++] = i + 1;// 填入队列killperson++;solider[i] = -1;// 杀死当前编号士兵}}i = (i + 1) % total;// 向后遍历if (killperson == total) {break;}}System.out.println("出环按顺序为:");for (int k = 0; k < outSequence.length; k++) {// 输出出环顺序System.out.print(outSequence[k] + " ");}}public static void main(String[] args) {int total = 0;int numCount = 0;int begin = 0;Scanner scn = new Scanner(System.in);while (true) {System.out.println("Input total num:");total = scn.nextInt();System.out.println("Input numCount:");numCount = scn.nextInt();System.out.println("Input begin:");begin = scn.nextInt();if (total != 0 && numCount != 0 && total > numCount) {MyJosephus mj = new MyJosephus(total, numCount, begin);mj.exec();break;} else {System.out.println("您输入的数据不合理,请重试!");}}}}

输出结果:
输出结果

转载于:https://www.cnblogs.com/mrzhang123/p/5365834.html

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

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

相关文章

地理信息科学前沿-[热词]

1. LBS Location Based Service&#xff1a;基于位置的服务&#xff0c;它是通过电信移动运营商的无线电通讯网络&#xff08;如GSM网、CDMA网&#xff09;或外部定位方式(如GPS)获取移动终端用户的位置信息&#xff08;地理坐标&#xff0c;或大地坐标&#xff09;&#xff0c…

《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.2.2 内存...

本节书摘来华章计算机《vSphere性能设计&#xff1a;性能密集场景下CPU、内存、存储及网络的最佳设计实践》一书中的第1章 &#xff0c;第1.2.2节&#xff0c;[美] 克里斯托弗库塞克&#xff08;Christopher Kusek&#xff09; 著 吕南德特施皮斯&#xff08;Rynardt Spies&a…

如何检查服务已在依赖注入容器中注册

前言依赖关系注入(DI)&#xff0c;是一种在类及其依赖项之间实现控制反转(IoC)的技术。在ASP.NET Core中&#xff0c;依赖关系注入是“一等公民”&#xff0c;被大量使用。但是有时&#xff0c;我们仅仅只需要知道服务是否在依赖注入容器中已注册。比如&#xff0c;不注册使用分…

iOS9 Storyboard unwind segue反回传递事件时机详细步骤

当返回上一个界面且需要上一个界面做某事时&#xff0c;用unwind segue实现起来比delegate简单许多&#xff0c;甚至有时不适合用delegate来实现&#xff0c;那么我们就用unwind segue吧&#xff0c;而且像1->2->3这样的跳转,3视图可以通过unwind segue方便的返回到1、2任…

ios俩个APP之间跳转、传值

两个APP之间的跳转是通过[[UIApplication sharedApplication] openURL:url]这种方式来实现的。 1.首先设置第一个APP的url地址 2.接着设置第二个APP的url地址 3.需要跳转的时候 NSString *urlString [NSString stringWithFormat:"AppJumpSecond://%",textField.tex…

.Net Core手撸一个基于Token的权限认证

说明权限认证是确定用户身份的过程。可确定用户是否有访问资源的权力今天给大家分享一下类似JWT这种基于token的鉴权机制基于token的鉴权机制&#xff0c;它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用,不需要去考虑用户在哪一台服务器…

Mybatis-Generator(MBG)教程与Idea的MBG插件

简介 Mybatis Generator(MBG)&#xff0c;下面我们统称为MBG&#xff0c;是一个Mybatis和iBatis的代码生成器。他可以内省数据库的表&#xff08;或多个表&#xff09;然后生成可以用来访问&#xff08;多个&#xff09;表的基础对象。这样减少了项目新建时各种配置对象&#x…

Windows Server 2008 RemoteApp---发布应用程序

本章节一起来体验RemoteApp应用程序发布功能&#xff0c;本功能利用了微软应用程序虚拟化技术&#xff0c;打个比方&#xff0c;我这台电脑上并没有安装Excel2010&#xff0c;但我现再要用Excel2010该怎么办&#xff1f;难道去找Office2010的光盘来安装吗&#xff1f;不用这么麻…

.NET 中密封类的性能优势

.NET 中密封类的性能优势Intro最近看到一篇文章 Performance benefits of sealed class in .NET&#xff0c;觉得写得不错&#xff0c;翻译一下&#xff0c;分享给大家。目前看到的一些类库中其实很多并没有考虑使用密封类&#xff0c;如果你的类型是不希望被继承的&#xff0c…

jQuery-1.9.1源码分析系列(十) 事件系统——事件绑定

事件绑定的方式有很多种。使用了jQuery那么原来那种绑定方式&#xff08;elem.click function(){...})就不推荐了&#xff0c;原因&#xff1f; 最主要的一个原因是elem.click fn这种方式只能绑定一个事件处理&#xff0c;多次绑定的只会保留最后一次绑定的结果。 看一下jQue…

Windows 8系统平台上应用软件安装心得

1.ArcGIS 10.2安装 需要单独安装.NET 3.5,GIS软件自带的.NET系统不识别&#xff0c;点击360云盘地址进行下载&#xff08;提取码为&#xff1a;1ed3&#xff09;。&#xff08;另外&#xff0c;Win8系统上安装.NET可以参考&#xff1a;http://blog.csdn.net/aijavaer/article/d…

Android视图绘制流程完全解析,带你一步步深入了解View(二)

转自&#xff1a;http://blog.csdn.net/guolin_blog/article/details/16330267 在上一篇文章中&#xff0c;我带着大家一起剖析了一下LayoutInflater的工作原理&#xff0c;可以算是对View进行深入了解的第一步吧。那么本篇文章中&#xff0c;我们将继续对View进行深入探究&…

C# 线程问题之死锁

过多的锁定也会有麻烦。在死锁中&#xff0c;至少有两个线程被挂起&#xff0c;并等待对方解除锁定。由于两个线程都在等待对方&#xff0c;就出现了死锁&#xff0c;线程将无限等待下去。为了说明死锁&#xff0c;下面实例化 StateObject 类型的两个对象&#xff0c;并把它们传…

Matlab图形绘制

1.正余弦曲线 例如自变量从0到10&#xff0c;间隔为0.1的曲线代码如下&#xff1a; 正弦 t 0:.1:10; y sin(t); plot(t,y); 余弦 t 0:.1:10; y cos(t); plot(t,y); 正余弦图形显示如下&#xff1a;

Blazor University (5)组件 — 字面量、表达式和指令

原文链接&#xff1a;https://blazor-university.com/components/literals-expressions-and-directives/字面量、表达式和指令源代码[1]请注意&#xff0c;本节一般不涵盖 Razor 标记。它不会涵盖诸如条件输出、循环等内容。该主题在网络和书籍中的其他地方得到了广泛的介绍。使…

.NET6之MiniAPI(二十七):Metrics

应用的各种Metrics是保证应用健康稳定运行的基础&#xff0c;特别对于一些可用性有所要求的应用&#xff0c;本文介绍prometheus-net这个三方指示库。prometheus-net的工作原理是&#xff0c;在应用内部埋点&#xff0c;通过prometheus采集数据&#xff0c;然后通过grafana把采…

回溯算法之布罗夫卫队(最大团问题)

1、问题 在原始部落中,由于食物缺乏,部落居民经常因为争夺猎物发生冲突,几乎每个居民都 有自己的仇敌。部落酋长为了组织一支保卫部落的卫队,希望从居民中选出最多的居民加入 卫队,并保证卫队中任何两个人都不是仇敌。假设已给定部落中居民间的仇敌关系图,编程 计算构建部落护…

microdot - 一个开源 .NET 微服务框架。

简介Microdot 是一个开源 .NET 框架&#xff0c;可满足轻松创建微服务的许多需求。它的一些主要特点•用于托管微服务的服务容器•服务间 RPC&#xff0c;便于基于接口的服务通信•服务之间的客户端透明响应缓存•日志记录和分布式跟踪支持•客户端负载均衡和服务发现•详细的健…

slider控件控制文本框字体大小

1.控件代码 <pre name"code" class"csharp"> <Slider x:Name"slider1" HorizontalAlignment"Left" Margin"0,261,0,0" VerticalAlignment"Top" Width"446" ValueChanged"Slid…

争时金融java_Java高并发编程基础之AQS

引言曾经有一道比较比较经典的面试题“你能够说说java的并发包下面有哪些常见的类&#xff1f;”大多数人应该都可以说出CountDownLatch、CyclicBarrier、Sempahore多线程并发三大利器。这三大利器都是通过AbstractQueuedSynchronizer抽象类(下面简写AQS)来实现的&#xff0c;所…