Java 程序设计报告[对接java的迭代器接口]

news2025/2/24 7:48:30

1:程序的功能设计与分析

        -:将实现deque与stack

        -:采用继承与内部类来提高程序的拓展性、安全性、简洁性

        -:对接到java.util.iterator中的iterator接口与iterable接口

2:程序的特点分析

        -:观察到队列、栈都可以用链表进行模拟,故在设计一个链表为底层类,设计队列的接口和栈的接口,并且链表继承这两个接口,从而实现写一次代码多次使用

        -:采用泛型,用于提高重新的拓展性

3:类图

4:为什么这么设计:

        -:为什么设计这两个内部类?

        首先要观察到list内部有两个内部类listNode与listIterator,其访问性前为static public后为private。设计前者为内部类的目的是提高代码的安全性,因为每种数据结构的节点定义都不同,所以将特定的数据结构与特定的节点绑定到一起有助于程序的可读性,且static public的内部类创建出来的实例并不会与外部类有耦合,这也进一步确保了程序的安全性。设计后者为内部类的原因是利用内部类与外部类的耦合实现多继承,因为listIterator与list并不是一个is-a的关系,所以本人不必考虑用list与iterator继承,以此来实现iterator的接口,用内部类来实现接口有助于外部类摆脱这种没必要的耦合,当然,我们并不希望外界能够访问到这一内部类,其外部与之交互的方法仅仅设置为iterator()函数,所以设计为private

        -:为什么使用接口来实现deque和stack?

        因为deque和stack都可以用list来实现相应的需求,所以我们考虑用接口来封装list,使之完成对应的需求,在java的标准库容器中,这样的设计也是非常常见的,对于map这种关联性的容器,我们可以封装平衡树和hash表来实现对应的需求,而且我们可以根据程序环境的不同来更改底层实现,可以拥有更好的灵活性;

        -:deque与deque_ifc的关系为什么是组合关系而非继承关系?

        在设计模式中,我们提倡在程序设计时要在组合和继承时选择其中一个的时,优先考虑组合关系,只有当子类必须要向上向上转型为父类的时候,才考虑用继承;

5:其他一些需要考虑的地方

        -:固然使用接口封装一个容器来实现另外一种容器这种方法很高效,但这种高效仅仅限制于代码实现,在空间上,并不是特别友好,因为在一个容器实现另外一直容器时,我一定会获得一些没必要的负担,即一些功能我们用不上,但因为只是对容器的封装,我们没法对这种负担进行优化,不同容器之间的节点就是一个典型的有负担的部分;

        这个时候有一个代替的方案,及对有负担的部分考虑用建筑者模式,这种设计多种模块替代有负担的部分,但这种模式可能会引发一些“不知情的错误”,比如我想用stack,但我将节点设置且deque容器的节点,这回导致一些方法运行错误;

6:源码实现:

import java.util.Iterator;

interface deque_ifc<T> {
    public void pushBack(T data);
    public void pushFront(T data);
    public void popBack();
    public void popFront();
    public T getFront();
    public T getBack();
    public int size();
    public Iterator<T> iterator();
}

interface stack_ifc<T>{
    public void pushFront(T data);
    public T getFront();
    public void popFront();
    public int size();
    public Iterator<T> iterator();
}

class deque<T> implements Iterable<T>{
    private deque_ifc<T> contain;
    public deque(deque_ifc<T> ifc){
        this.contain=ifc;
    }
    public void setContain(deque_ifc<T> contain){
        this.contain=contain;
    }
    public void pushBack(T data){
        this.contain.pushBack(data);
    }
    public void pushFront(T data){  
        this.contain.pushFront(data);
    }
    public void popBack(){
        this.contain.popBack();
    }
    public void popFront(){
        this.contain.popFront();
    }
    public T getFront(){
        return this.contain.getFront();
    }
    public T getBack(){
        return this.contain.getBack();
    }
    public int size(){
        return this.contain.size();
    }
    public Iterator<T> iterator(){
        return this.contain.iterator();
    }
} 

class stack<T> implements Iterable<T>{
    private stack_ifc<T> contain;
    public stack(stack_ifc<T> ifc){
        this.contain = ifc;
    }
    public Iterator<T> iterator(){
        return this.contain.iterator();
    }
    public void pop(){
        this.contain.popFront();
    }
    public void push(T data){
        this.contain.pushFront(data);
    }
    public int size(){
        return this.contain.size();
    }
}

public class list<T> implements deque_ifc<T>,Iterable<T>,stack_ifc<T>{
    static public class listNode<T>{
        private T data;
        private listNode<T> next;
        private listNode<T> front;
        public void setNext(listNode<T> next){
            this.next=next;
        }
        public listNode<T> getNext(){
            return this.next;
        }
        public void setData(T newData){
            this.data=newData;
        }
        public T getData(){
            return data;
        }
        public listNode(T data){
            this.data=data;
        }
        public listNode(){}
    }
    private class listIterator implements Iterator<T>{//
        private listNode<T> iteratorPointer;
        listIterator(){
            iteratorPointer=head;
        }
        @Override
        public boolean hasNext() {
            return iteratorPointer.next != tail && iteratorPointer != null;
        }
        @Override
        public T next() {
            iteratorPointer=iteratorPointer.next;
            return iteratorPointer.data;
        }

    }
    public void pushFront(T data){
        listNode<T> newNode=new listNode<T>(data);
        listNode<T> first = head.next;
        head.next = newNode;
        newNode.front = head;
        first.front = newNode;
        newNode.next = first;
        size++;
    }
    public void pushBack(T data){
        listNode<T> newNode = new listNode<T>(data);
        listNode<T> back = tail.front;
        tail.front=newNode;
        newNode.next=tail;
        back.next=newNode;
        newNode.front=newNode;
        size++;
    }
    public void popBack() {
        listNode<T> node = tail.front.front;
        tail.front = node;
        node.next = tail;
        size--;
    }
    public void popFront() {
        listNode<T> node = head.next.next;
        head.next = node;
        node.front = head;
        size--;
    }
    public Iterator<T> iterator(){
        return new listIterator();
    }
    public listNode<T> begin() {
        return head.next;
    }

    public listNode<T> end() {
        return tail;
    }

    public int size() {
        return size;
    }
    @Override
    public T getFront() {
        if(size!=0) return head.next.data;
        return null;
    }
    @Override
    public T getBack() {
        if(size!=0) return tail.front.data;
        return null;
    }
    list() {
        head = new listNode<T>();
        tail = new listNode<T>();
        head.next = tail;
        tail.front = head;
    }

    private listNode<T> head, tail;
    private int size;
    @FunctionalInterface
    private interface noPara{
        void test();
    }
    static public void main(String[] None){
        deque<Integer> que = new deque<Integer>(new list<Integer>());
        for (int i = 0; i < 10; i++) {
            que.pushBack(i);
        }
        System.out.println("deque iterator");
        for (Iterator<Integer> t = que.iterator(); t.hasNext();) {
            Integer data = t.next();
            System.out.printf("%d ", data);
        }
        System.out.println();
        System.out.println("deque iterable");
        for (Integer t : que) {
            System.out.printf("%d ", t);
        }
        System.out.println();
        stack<Integer> stack_int = new stack<Integer>(new list<Integer>());

        for (int i = 0; i < 10; i++) {
            stack_int.push(i);
        }
        System.out.println("stack iterator");
        for (Iterator<Integer> t = stack_int.iterator(); t.hasNext();) {
            Integer data = t.next();
            System.out.printf("%d ", data);
        }
        System.out.println();
        System.out.println("stack iterator");
        for (Integer t : stack_int) {
            System.out.printf("%d ", t);
        }
    }

    
}

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

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

相关文章

二战华为成功上岸,准备了小半年,要个27k应该也算不上很高吧~

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;华为的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

二、肺癌检测-LUNA数据集下载和介绍

LUNA数据集是一个肺部肿瘤CT扫描结果的数据集&#xff0c;可用于作为肺癌检测的模型训练。 一、数据集下载 step1&#xff1a;登陆LUNA16官网&#xff0c;链接为&#xff1a;Home - Grand Challenge step2&#xff1a;点击网站左侧【download】&#xff0c;进入下载页面。 s…

图形学-着色频率与渲染管线

1.着色频率 根据不同的着色方式&#xff0c;有不同的着色频率&#xff0c;主要的着色频率分为三种——面着色&#xff0c;顶点着色和像素着色。主要的不同之处在于法线的选择方式不同。 面着色 Flat Shading指的是计算每一个三角形平面的法线后对一个平面整体进行着色&#x…

Redo日志和Undo日志

Redo日志和Undo日志Redo日志和Undo日志1 Redo日志和Undo日志概述2 Redo日志2.1 为什么需要Redo日志2.2 Redo日志的好处、特点3 Undo日志3.1 如何理解Undo日志3.2 Undo日志的作用Redo日志和Undo日志 1 Redo日志和Undo日志概述 事务有4种特性&#xff1a;原子性、一致性、隔离性…

C++类和对象(中)【万字详解】

这一篇就是C中的类和对象的核心内容了. 目录 类的6个默认成员函数 构造函数 概念 特性 析构函数 概念 特性 拷贝构造函数 概念 特性 赋值运算符重载 运算符重载 赋值运算符重载 const成员 const修饰的类成员函数 8.取地址及const取地址操作符重载 类的6个默认成员函数 如果一个…

洛谷千题详解 | P1004 [NOIP2000 提高组] 方格取数【C++、Java、Pascal语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Java源码&#xff1a; Pascal源码&#xff1a; ---------------------------------------------------------------------…

KMP算法模式匹配——手工求解next和nextval数组值

本文需要了解KMP算法基本流程和相关概念&#xff0c;如有问题&#xff0c;请先进行基础学习&#xff1a;链接: 天勤-KMP算法易懂版 求解next数组值 给定模式串&#xff1a;“ababaaab”&#xff0c;求解其next数组值。 例子里面的ababaaab&#xff0c;我们定义一个 i 为模式串的…

【微服务】Nacos Discovery--服务治理

Nacos Discovery--服务治理前言服务治理常见的注册中心ZookeeperEurekaConsulNacosNacos 入门搭建nacos环境将商品微服务注册到nacos将订单微服务注册到nacos总结前言 上一章中&#xff0c;我们利用用户–订单–商品&#xff0c;实现了三个简单的微服务&#xff0c;实现了微服…

如何寻找计算机领域的英文文献?

大家一定或多或少都有文献检索的经验吧&#xff0c;中文文献还好&#xff0c;我们总归是对自己的的母语比较熟悉&#xff0c;通过关键词或其他检索条件&#xff0c;总能得心应手地找到自己需要的文献。相较于中文文献&#xff0c;对外文文献的检索就显得难度增加了不少&#xf…

pthread_create创建线程失败问题排查

一些基础概念的了解 Android中线程&#xff08;Thread&#xff09;的创建及内存分配过程分析 pthread_create创建线程失败的OOM详解 不可思议的OOM 通过上面的文章&#xff0c;我们知道为什么会报pthread_create错误 在创建线程的时候&#xff0c;报的下面这些错误&#xff0…

SAP采购订单中的净价是单价还是总价?

在采购订单中习惯上我们把订单项目的的净价理解为什么&#xff1f;单价还是总价&#xff1f; 先不着急回答。看看以下两个采购订单的对比截图就能了解&#xff0c; 在4050004000这笔采购订单中&#xff0c;采购10件黄色箱子&#xff0c;每10件500元。所以&#xff0c;净价500…

《JavaSE-第十七章》之LinkedList

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 刷题求职神器 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水…

Python Excel导入Mysql的通用方法

文章目录一、前言二、实现一、前言 此代码将导入部分尽量通用&#xff0c;仅配置下面两项就可以进行导入了&#xff1a; 从哪个excel导入到哪个mysql表 在程序中配置 他们之间的字段如何对应 写在mysql表中 ps&#xff1a;id&#xff0c;create_time&#xff0c;update_tim…

基于IDEA创建SpringBoot项目并进行入门分析

基于IDEA创建SpringBoot项目并进行入门分析 文章目录基于IDEA创建SpringBoot项目并进行入门分析SpringBoot 项目创建创建Module项目结构分析SpringBoot 项目启动分析启动入口启动过程概要分析SpringBoot 快速入门分析业务描述API设计分析代码编写及运行运行过程中的BUG分析Spri…

单商户商城系统功能拆解26—营销中心—限时秒杀

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

数电学习(六、时序逻辑电路)(三)

文章目录时序逻辑电路的设计方法同步时序逻辑电路的设计方法一般步骤改进步骤例&#xff1a;蚂蚁走迷宫背景分析继续编码状态&#xff0c;然后写出状态图&#xff0c;然后卡诺图化简&#xff0c;得到方程设计总结时序逻辑电路的设计方法 同步时序逻辑电路的设计方法 一般步骤…

2022最新SpringCloud面试题附完整答案

一、选择题 1.启动Ribbon的类注解是: ( ) A RibbonClient B EnableClient C EnableDisscoveryClient D Ribbon 2.下面哪个注解不是SpringbootApplication包含的默认属性值&#xff1a;&#xff08; &#xff09; A: Configuration B: EnableAutoConfiguration C: ComponentSc…

【LINUX】Linux最常用的20个基本指令 介绍~分析

什么是 Linux ​ Linux 是一款基于 GNU 通用公共许可协议 的 自由和开放源代码 的类UNIX操作系统&#xff0c;该操作系统的内核由 Linus Torvalds 在1991年首次发布。之后&#xff0c;在加上用户空间的应用程序之后&#xff0c;就成为了Linux操作系统。 但是&#xff0c;严格来…

springboot充电桩综合管理系统

目录 1 绪论 1 1.1 课题背景 1 1.2 课题研究现状 1 1.3 初步设计方法与实施方案 2 1.4 本文研究内容 2 2 系统开发环境 4 2.1 Java技术 4 2.2 JSP技术 4 2.3 B/S模式 4 2.4 MyEclipse环境配置 5 2.5 MySQL环境配置 5 2.6 SSM框架 6 3 系统分析 7 3.1 系统可行性分析 7 3.1.1 经…

基于 BP 神经网络特征提取的指纹识别应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…