之前初学时看过可以实现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循环的更多相关文章

  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. c++ STL之unordered_set

    unordered_set的特点: 自身值就是主键,所以值唯一并且不可修改 基于hash表的无序排列 unordered_set基于哈希表,是无序的. 在一个 unordered_set 容器中,元素 ...

  2. jdk1.8-ArrayDeque

    一:类的继承关系 UML图 类的继承关系: )))))) ]) & ()) == ) & ()) == ) & ()] = e) ) & (); return resu ...

  3. spring-boot集成3:集成swagger

    Why swagger? 使用swagger让你从编写接口文档的无聊工作中解脱出来 1.Maven依赖 <!-- swagger --> <dependency> <gr ...

  4. Qt输出中文乱码的问题

    /* 我遇到的情况: 文件编码为UTF-8.程序输输出中文位乱码. 解决方案: 1. 工具->选项->环境->语言: Chinese 2. 选项->文本编辑器->行为-& ...

  5. 机器学习笔记:支持向量机(svm)

    支持向量机(svm)英文为Support Vector Machines 第一次接触支持向量机是2017年在一个在线解密游戏"哈密顿行动"中的一个关卡的二分类问题,用到了台湾教授写 ...

  6. C#中StringBuilder类的使用总结

    String 对象是不可改变的.每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新 ...

  7. 【神经网络与深度学习】【C/C++】ZLIB学习2

    Zlib文件压缩和解压 开源代码:http://www.zlib.net/ zlib使用手册:http://www.zlib.net/manual.html zlib wince版:http://ww ...

  8. 【Python开发】Lambda表达式使用

    lambda只是一个表达式,函数体比def简单很多. lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去. lambda表达式是起到一个函数速写的作用.允 ...

  9. 再谈Java数据结构—分析底层实现与应用注意事项

    在回顾js数据结构,写<再谈js对象数据结构底层实现原理-object array map set>系列的时候,在来整理下java的数据结构. java把内存分两种:一种是栈内存,另一种是 ...

  10. 笔记本通过命令配置wifi win7系统

    查看本子是否支持承载网络 在开始菜单>附件>命令提示符(右键点击:以管理员身份运行) 命令行中输入以下内容,找到[支持的承载网络]这一行,如果为"是"就OK了,表示支持 ...