手动写一个类支持foreach循环
之前初学时看过可以实现Iterable接口实现Iterator迭代器的支持,并且也支持foreach循环。现在学习了数据结构,手动写一个单链表支持foreach循环吧。
手写foreach循环步骤:
1.实现Iteratable接口
2.内部类实现Iterator接口,重写getNext方法和next方法
例子:写了这两步即可实现foreach循环和Iterator迭代
- package com.littlepage.foreach;
- public class Node<T> {
- //member variable
- private T data;
- private Node<T> next;
- //constructor
- public Node() {
- data=null;
- next=null;
- }
- public Node(T t) {
- data=t;
- }
- //getters and setters
- public T getData() {
- return data;
- }
- public void setData(T data) {
- this.data = data;
- }
- public Node<T> getNext() {
- return next;
- }
- public void setNext(Node<T> next) {
- this.next = next;
- }
- //toString
- @Override
- public String toString() {
- return data.toString();
- }
- //equals
- @SuppressWarnings("unchecked")
- @Override
- public boolean equals(Object obj) {
- Node<T> temp1=this;
- Node<T> node=(Node<T>)obj;
- if(!data.equals(node.getData())) return false;
- else if(next==null&&node.getNext()!=null) return false;
- else if(next!=null&&node.getNext()==null) return false;
- else if(next==null&&node.getNext()==null) return true;
- else{
- temp1=temp1.getNext();
- node=node.getNext();
- return temp1.equals(node);
- }
- }
- }
- package com.littlepage.foreach;
- import java.util.Iterator;
- public class SinglyLinkedList<T> implements Iterable<T> {
- //member variable
- private Node<T> head;
- private int size;
- //constructor
- public SinglyLinkedList() {
- head=new Node<>();
- }
- public SinglyLinkedList(T[] element) {
- head=new Node<T>();
- for(int i=;i<element.length;i++){
- if(head.getData()==null) head.setData(element[i]);
- else {
- Node<T> temp=head;
- while(temp.getNext()!=null){
- temp=temp.getNext();
- }
- temp.setNext(new Node<T>(element[i]));
- }
- }
- size=element.length;
- }
- public SinglyLinkedList(SinglyLinkedList<T> singlyLinkedList){
- head=singlyLinkedList.getHead();
- size=singlyLinkedList.getSize();
- }
- //getters and setters
- public Node<T> getHead() {
- return head;
- }
- public void setHead(Node<T> head) {
- this.head = head;
- }
- public int getSize() {
- return size;
- }
- public void setSize(int size) {
- this.size = size;
- }
- //toString
- @Override
- public String toString() {
- StringBuilder sb=new StringBuilder("[");
- sb.append(head.getData()+",");
- Node<T> temp=head;
- while(temp.getNext()!=null){
- temp=temp.getNext();
- sb.append(temp.getData()+",");
- }
- sb.replace(sb.lastIndexOf(","), sb.lastIndexOf(",")+, "]");
- return sb.toString();
- }
- //others method
- public void concat(SinglyLinkedList<T> list){
- Node<T> temp=head;
- while(temp.getNext()!=null){
- temp=temp.getNext();
- }
- temp.setNext(list.getHead());
- size+=list.getSize();
- }
- public Node<T> search(T element){
- Node<T> temp=head;
- if(head.getData().equals(element)) return head;
- while(temp.getNext()!=null){
- if(temp.getNext().getData().equals(element)) return temp.getNext();
- temp=temp.getNext();
- }
- return null;
- }
- public boolean contain (T element){
- Node<T> temp=head;
- if(head.getData().equals(element)) return true;
- while(temp.getNext()!=null){
- if(temp.getNext().getData().equals(element)) return true;
- temp=temp.getNext();
- }
- return false;
- }
- public void add(T element){
- if(head.getData()==null) head.setData(element);
- else{
- if(head.getNext()==null) head.setNext(new Node<>(element));
- else{
- Node<T> temp=head;
- while(temp.getNext()!=null){
- temp=temp.getNext();
- }
- temp.setNext(new Node<>(element));
- }
- }
- size++;
- }
- public boolean remove (T element){
- Node<T> temp=head;
- if(head.getData().equals(element)) {
- head=head.getNext();
- size--;
- return true;
- }
- while(temp.getNext()!=null){
- if(temp.getNext().getData().equals(element)) {
- temp.setNext(temp.getNext().getNext());
- return true;
- }
- temp=temp.getNext();
- }
- return false;
- }
- public boolean replace (Object obj, T element){
- Node<T> temp=head;
- if(head.getData().equals(obj)) {
- head.setData(element);
- return true;
- }
- while(temp.getNext()!=null){
- if(temp.getNext().getData().equals(obj)) {
- temp.getNext().setData(element);
- return true;
- }
- temp=temp.getNext();
- }
- return false;
- }
- //getElement
- public T getElement(int index){
- if(index<||index>=size) return null;
- Node<T> temp=head;
- if(index==) return head.getData();
- else{
- for(int i=;i<index;i++){
- temp=temp.getNext();
- }
- return temp.getData();
- }
- }
- //getNode
- public Node<T> getNode(int index){
- if(index<||index>=size) return null;
- Node<T> temp=head;
- if(index==) return head;
- else{
- for(int i=;i<index;i++){
- temp=temp.getNext();
- }
- return temp;
- }
- }
- public void set(int index,T value){
- if(index<) index=;
- if(index>=size) index=size-;
- Node<T> temp=head;
- if(index==) head.setData(value);
- else{
- for(int i=;i<index;i++){
- temp=temp.getNext();
- }
- temp.setData(value);
- }
- }
- @Override
- public boolean equals(Object obj) {
- @SuppressWarnings("unchecked")
- SinglyLinkedList<T> singlyLinkedList=(SinglyLinkedList<T>)obj;
- return head.equals(singlyLinkedList.getHead());
- }
- @Override
- public Iterator iterator() {
- class MyIterator implements Iterator{
- Node temp=head;
- @Override
- public boolean hasNext() {
- return temp!=null;
- }
- @Override
- public Object next() {
- Node<T> pre=temp;
- temp=temp.getNext();
- return pre.getData();
- }
- }
- return new MyIterator();
- }
- }
- package com.littlepage.foreach;
- import java.util.LinkedList;
- public class Test {
- public static void main(String[] args) {
- SinglyLinkedList<Integer> sll=new SinglyLinkedList<>();
- sll.add(5);
- sll.add(4);
- for (Integer e:sll) {
- System.out.println(e);
- }
- }
- }
手动写一个类支持foreach循环的更多相关文章
- 原来热加载如此简单,手动写一个 Java 热加载吧
1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...
- C# 9.0新特性详解系列之二:扩展方法GetEnumerator支持foreach循环
1.介绍 我们知道,我们要使一个类型支持foreach循环,就需要这个类型满足下面条件之一: 该类型实例如果实现了下列接口中的其中之一: System.Collections.IEnumerable ...
- Java基础-接口.编写2个接口:InterfaceA和InterfaceB;在接口InterfaceA中有个方法void printCapitalLetter();在接口InterfaceB中有个方法void printLowercaseLetter();然 后写一个类Print实现接口InterfaceA和InterfaceB,要求 方法 实现输出大写英文字母表的功能,printLowerca
#34.编写2个接口:InterfaceA和InterfaceB:在接口InterfaceA中有个方法void printCapitalLetter():在接口InterfaceB中有个方法void ...
- 如何手动写一个Python脚本自动爬取Bilibili小视频
如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...
- CakePHP调用model类和foreach循环
1. 引入Model类 2.调用model类(Guarantee)下的getCity()方法 3.写sql语句 并返回获得值 4.foreach循环取得的城市
- 【转】手动写一个Behavior Designer任务节点
http://blog.csdn.net/qq_33747722/article/details/53539532 自己手写一个类似于CanSeeObject.Seek等任务节点并不是一件难事 下面我 ...
- java能不能自己写一个类叫java.lang.System/String正确答案
原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.S ...
- matlab如何写一个类
类是一种数据类型,与普通的数据类型不同的是类不仅包含数据,还包含对数据的操作,类把数据和数据操作方法封装在一起,作为一个整体参与程序的运行.类具有可继承性,创建一个新的类的时候,可以在一个基类中添加成 ...
- 手动写一个Servlet
一.做一个类,派生自HttpServlet 1.导两个包 javax.servlet.*; javax.servlet.http.* 2.重写两个方法doGet,doPost 打开tomcat中的se ...
随机推荐
- 转-Uptime与数据中心等级认证
1 数据中心等级认证 随着数据中心的蓬勃发展,越来越多的标准被制定出具.其中,Uptime Tier认证在业内是认同度最高的标准.以前,Uptime在中国的宣传很少,很多人对Uptime及其认证体系不 ...
- CornerNet 算法笔记
论文名称:CornerNet: Detecting Objects as Paired Keypoints 论文链接:https://arxiv.org/abs/1808.01244 代码链接:htt ...
- 【Python开发】urllib2.urlopen超时问题
原帖地址:http://hi.baidu.com/yss1983/item/933fbe45a09c43e01381da06 问题描述: 没有设置timeout参数,结果在网络环境不好的情况下 ...
- Web Service简介与开发实例
简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的 ...
- 统计学习方法 | 第1章 统计学习方法概论 | np.random.rand()函数
np.random.rand()函数 语法: np.random.rand(d0,d1,d2……dn) 注:使用方法与np.random.randn()函数相同 作用: 通过本函数可以返回一个或一组服 ...
- Centos7 安装多版本php 并添加swoole拓展
服务器默认安装了php7 直接使用lnmp工具包安装php5.6 使用之前的lnmp安装包,切换到root sudo su - 运行 选择5.6 安装完成 没有安装swoole拓展 由官方https: ...
- lua编译器和ide
这里有一个网址,上面记录了大部分流行的LUA开发工具,包括IDE和Editor. http://www.wowwiki.com/Lua_editors 一.Eclipse LDT 1.语法高亮,自动提 ...
- java并发学习资料
1.Java 并发编程知识梳理以及常见处理模式 https://github.com/Fadezed/concurrency 2.Java 高并发多线程编程系列 https://github.com/ ...
- [转帖]Java 8新特性探究 前言
Java 8新特性探究 前言 https://my.oschina.net/benhaile/blog/174136 讲下java的历史 感觉挺好的. 评论 17 jdk8java8javase新特性 ...
- HanLP-停用词表的使用示例
停用词表的修改 停用词表在“pyhanlp\static\data\dictionary”路径下的“stopwords.txt”文件中,CoreStopWordDictionary.apply方法支持 ...