之前初学时看过可以实现Iterable接口实现Iterator迭代器的支持,并且也支持foreach循环。现在学习了数据结构,手动写一个单链表支持foreach循环吧。

手写foreach循环步骤:

1.实现Iteratable接口

2.内部类实现Iterator接口,重写getNext方法和next方法

例子:写了这两步即可实现foreach循环和Iterator迭代

  1. package com.littlepage.foreach;
  2.  
  3. public class Node<T> {
  4. //member variable
  5. private T data;
  6. private Node<T> next;
  7.  
  8. //constructor
  9. public Node() {
  10. data=null;
  11. next=null;
  12. }
  13.  
  14. public Node(T t) {
  15. data=t;
  16. }
  17.  
  18. //getters and setters
  19. public T getData() {
  20. return data;
  21. }
  22.  
  23. public void setData(T data) {
  24. this.data = data;
  25. }
  26.  
  27. public Node<T> getNext() {
  28. return next;
  29. }
  30.  
  31. public void setNext(Node<T> next) {
  32. this.next = next;
  33. }
  34.  
  35. //toString
  36. @Override
  37. public String toString() {
  38. return data.toString();
  39. }
  40.  
  41. //equals
  42. @SuppressWarnings("unchecked")
  43. @Override
  44. public boolean equals(Object obj) {
  45. Node<T> temp1=this;
  46. Node<T> node=(Node<T>)obj;
  47. if(!data.equals(node.getData())) return false;
  48. else if(next==null&&node.getNext()!=null) return false;
  49. else if(next!=null&&node.getNext()==null) return false;
  50. else if(next==null&&node.getNext()==null) return true;
  51. else{
  52. temp1=temp1.getNext();
  53. node=node.getNext();
  54. return temp1.equals(node);
  55. }
  56. }
  57. }
  1. package com.littlepage.foreach;
  2.  
  3. import java.util.Iterator;
  4.  
  5. public class SinglyLinkedList<T> implements Iterable<T> {
  6. //member variable
  7. private Node<T> head;
  8. private int size;
  9.  
  10. //constructor
  11. public SinglyLinkedList() {
  12. head=new Node<>();
  13. }
  14.  
  15. public SinglyLinkedList(T[] element) {
  16. head=new Node<T>();
  17. for(int i=;i<element.length;i++){
  18. if(head.getData()==null) head.setData(element[i]);
  19. else {
  20. Node<T> temp=head;
  21. while(temp.getNext()!=null){
  22. temp=temp.getNext();
  23. }
  24. temp.setNext(new Node<T>(element[i]));
  25. }
  26. }
  27. size=element.length;
  28. }
  29.  
  30. public SinglyLinkedList(SinglyLinkedList<T> singlyLinkedList){
  31. head=singlyLinkedList.getHead();
  32. size=singlyLinkedList.getSize();
  33. }
  34.  
  35. //getters and setters
  36. public Node<T> getHead() {
  37. return head;
  38. }
  39.  
  40. public void setHead(Node<T> head) {
  41. this.head = head;
  42. }
  43.  
  44. public int getSize() {
  45. return size;
  46. }
  47.  
  48. public void setSize(int size) {
  49. this.size = size;
  50. }
  51.  
  52. //toString
  53. @Override
  54. public String toString() {
  55. StringBuilder sb=new StringBuilder("[");
  56. sb.append(head.getData()+",");
  57. Node<T> temp=head;
  58. while(temp.getNext()!=null){
  59. temp=temp.getNext();
  60. sb.append(temp.getData()+",");
  61. }
  62. sb.replace(sb.lastIndexOf(","), sb.lastIndexOf(",")+, "]");
  63. return sb.toString();
  64. }
  65.  
  66. //others method
  67. public void concat(SinglyLinkedList<T> list){
  68. Node<T> temp=head;
  69. while(temp.getNext()!=null){
  70. temp=temp.getNext();
  71. }
  72. temp.setNext(list.getHead());
  73. size+=list.getSize();
  74. }
  75.  
  76. public Node<T> search(T element){
  77. Node<T> temp=head;
  78. if(head.getData().equals(element)) return head;
  79. while(temp.getNext()!=null){
  80. if(temp.getNext().getData().equals(element)) return temp.getNext();
  81. temp=temp.getNext();
  82. }
  83. return null;
  84. }
  85.  
  86. public boolean contain (T element){
  87. Node<T> temp=head;
  88. if(head.getData().equals(element)) return true;
  89. while(temp.getNext()!=null){
  90. if(temp.getNext().getData().equals(element)) return true;
  91. temp=temp.getNext();
  92. }
  93. return false;
  94. }
  95.  
  96. public void add(T element){
  97. if(head.getData()==null) head.setData(element);
  98. else{
  99. if(head.getNext()==null) head.setNext(new Node<>(element));
  100. else{
  101. Node<T> temp=head;
  102. while(temp.getNext()!=null){
  103. temp=temp.getNext();
  104. }
  105. temp.setNext(new Node<>(element));
  106. }
  107. }
  108. size++;
  109. }
  110.  
  111. public boolean remove (T element){
  112. Node<T> temp=head;
  113. if(head.getData().equals(element)) {
  114. head=head.getNext();
  115. size--;
  116. return true;
  117. }
  118. while(temp.getNext()!=null){
  119. if(temp.getNext().getData().equals(element)) {
  120. temp.setNext(temp.getNext().getNext());
  121. return true;
  122. }
  123. temp=temp.getNext();
  124. }
  125. return false;
  126. }
  127.  
  128. public boolean replace (Object obj, T element){
  129. Node<T> temp=head;
  130. if(head.getData().equals(obj)) {
  131. head.setData(element);
  132. return true;
  133. }
  134. while(temp.getNext()!=null){
  135. if(temp.getNext().getData().equals(obj)) {
  136. temp.getNext().setData(element);
  137. return true;
  138. }
  139. temp=temp.getNext();
  140. }
  141. return false;
  142. }
  143.  
  144. //getElement
  145. public T getElement(int index){
  146. if(index<||index>=size) return null;
  147. Node<T> temp=head;
  148. if(index==) return head.getData();
  149. else{
  150. for(int i=;i<index;i++){
  151. temp=temp.getNext();
  152. }
  153. return temp.getData();
  154. }
  155. }
  156.  
  157. //getNode
  158. public Node<T> getNode(int index){
  159. if(index<||index>=size) return null;
  160. Node<T> temp=head;
  161. if(index==) return head;
  162. else{
  163. for(int i=;i<index;i++){
  164. temp=temp.getNext();
  165. }
  166. return temp;
  167. }
  168. }
  169.  
  170. public void set(int index,T value){
  171. if(index<) index=;
  172. if(index>=size) index=size-;
  173. Node<T> temp=head;
  174. if(index==) head.setData(value);
  175. else{
  176. for(int i=;i<index;i++){
  177. temp=temp.getNext();
  178. }
  179. temp.setData(value);
  180. }
  181. }
  182.  
  183. @Override
  184. public boolean equals(Object obj) {
  185. @SuppressWarnings("unchecked")
  186. SinglyLinkedList<T> singlyLinkedList=(SinglyLinkedList<T>)obj;
  187. return head.equals(singlyLinkedList.getHead());
  188. }
  189.  
  190. @Override
  191. public Iterator iterator() {
  192. class MyIterator implements Iterator{
  193. Node temp=head;
  194. @Override
  195. public boolean hasNext() {
  196. return temp!=null;
  197. }
  198.  
  199. @Override
  200. public Object next() {
  201. Node<T> pre=temp;
  202. temp=temp.getNext();
  203. return pre.getData();
  204. }
  205. }
  206. return new MyIterator();
  207. }
  208. }
  1. package com.littlepage.foreach;
  2.  
  3. import java.util.LinkedList;
  4.  
  5. public class Test {
  6. public static void main(String[] args) {
  7. SinglyLinkedList<Integer> sll=new SinglyLinkedList<>();
  8. sll.add(5);
  9. sll.add(4);
  10. for (Integer e:sll) {
  11. System.out.println(e);
  12. }
  13. }
  14. }

  

手动写一个类支持foreach循环的更多相关文章

  1. 原来热加载如此简单,手动写一个 Java 热加载吧

    1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...

  2. C# 9.0新特性详解系列之二:扩展方法GetEnumerator支持foreach循环

    1.介绍 我们知道,我们要使一个类型支持foreach循环,就需要这个类型满足下面条件之一: 该类型实例如果实现了下列接口中的其中之一: System.Collections.IEnumerable ...

  3. Java基础-接口.编写2个接口:InterfaceA和InterfaceB;在接口InterfaceA中有个方法void printCapitalLetter();在接口InterfaceB中有个方法void printLowercaseLetter();然 后写一个类Print实现接口InterfaceA和InterfaceB,要求 方法 实现输出大写英文字母表的功能,printLowerca

    #34.编写2个接口:InterfaceA和InterfaceB:在接口InterfaceA中有个方法void printCapitalLetter():在接口InterfaceB中有个方法void ...

  4. 如何手动写一个Python脚本自动爬取Bilibili小视频

    如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...

  5. CakePHP调用model类和foreach循环

    1. 引入Model类 2.调用model类(Guarantee)下的getCity()方法 3.写sql语句 并返回获得值 4.foreach循环取得的城市

  6. 【转】手动写一个Behavior Designer任务节点

    http://blog.csdn.net/qq_33747722/article/details/53539532 自己手写一个类似于CanSeeObject.Seek等任务节点并不是一件难事 下面我 ...

  7. java能不能自己写一个类叫java.lang.System/String正确答案

    原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.S ...

  8. matlab如何写一个类

    类是一种数据类型,与普通的数据类型不同的是类不仅包含数据,还包含对数据的操作,类把数据和数据操作方法封装在一起,作为一个整体参与程序的运行.类具有可继承性,创建一个新的类的时候,可以在一个基类中添加成 ...

  9. 手动写一个Servlet

    一.做一个类,派生自HttpServlet 1.导两个包 javax.servlet.*; javax.servlet.http.* 2.重写两个方法doGet,doPost 打开tomcat中的se ...

随机推荐

  1. 转-Uptime与数据中心等级认证

    1 数据中心等级认证 随着数据中心的蓬勃发展,越来越多的标准被制定出具.其中,Uptime Tier认证在业内是认同度最高的标准.以前,Uptime在中国的宣传很少,很多人对Uptime及其认证体系不 ...

  2. CornerNet 算法笔记

    论文名称:CornerNet: Detecting Objects as Paired Keypoints 论文链接:https://arxiv.org/abs/1808.01244 代码链接:htt ...

  3. 【Python开发】urllib2.urlopen超时问题

    原帖地址:http://hi.baidu.com/yss1983/item/933fbe45a09c43e01381da06 问题描述:     没有设置timeout参数,结果在网络环境不好的情况下 ...

  4. Web Service简介与开发实例

    简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的 ...

  5. 统计学习方法 | 第1章 统计学习方法概论 | np.random.rand()函数

    np.random.rand()函数 语法: np.random.rand(d0,d1,d2……dn) 注:使用方法与np.random.randn()函数相同 作用: 通过本函数可以返回一个或一组服 ...

  6. Centos7 安装多版本php 并添加swoole拓展

    服务器默认安装了php7 直接使用lnmp工具包安装php5.6 使用之前的lnmp安装包,切换到root sudo su - 运行 选择5.6 安装完成 没有安装swoole拓展 由官方https: ...

  7. lua编译器和ide

    这里有一个网址,上面记录了大部分流行的LUA开发工具,包括IDE和Editor. http://www.wowwiki.com/Lua_editors 一.Eclipse LDT 1.语法高亮,自动提 ...

  8. java并发学习资料

    1.Java 并发编程知识梳理以及常见处理模式 https://github.com/Fadezed/concurrency 2.Java 高并发多线程编程系列 https://github.com/ ...

  9. [转帖]Java 8新特性探究 前言

    Java 8新特性探究 前言 https://my.oschina.net/benhaile/blog/174136 讲下java的历史 感觉挺好的. 评论 17 jdk8java8javase新特性 ...

  10. HanLP-停用词表的使用示例

    停用词表的修改 停用词表在“pyhanlp\static\data\dictionary”路径下的“stopwords.txt”文件中,CoreStopWordDictionary.apply方法支持 ...