之前初学时看过可以实现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. 如何删除link-local(169.255.0.0) 路由表项

    route -n 时你总能看到这样一条路由Destination Gateway Genmask Flags Metric Ref Use Iface169.254.0.0 0.0.0.0 255.2 ...

  2. C基础知识(8):结构体、共用体、位域

    结构体 数组允许定义可存储相同类型数据项的变量,而结构体是C编程中另一种用户自定义的可用的数据类型,它允许用户可以存储不同类型的数据项. struct 语句的格式如下: struct [structu ...

  3. 05 vue-cli如何运行

    一.index.html index.html跟其他html一样,只有一个空的根节点,提供main.js用来挂载实例,所有内容通过vue来填充. 二.main.js main.js主要是引入vue框架 ...

  4. Android开发 移动端适配

    1 UI自适应(UGUI) UI自适应又分为锚点自适应和缩放.锚点主要控制UI控件在父控件之中的位置,同时也能影响缩放. 锚点自适应缩放: 我们使用UGUI创建一个界面,设计使用1920x1080分辨 ...

  5. 【POJ - 3087】Shuffle'm Up(模拟)

    Shuffle'm Up 直接写中文了 Descriptions: 给定两个长度为len的字符串s1和s2, 接着给出一个长度为len*2的字符串s12. 将字符串s1和s2通过一定的变换变成s12, ...

  6. C语言|作业12—学期总结

    一. 我学到的内容 二. 我的收获 作业链接 收获 C语言l博客作业01 对这个专业.学科以及markdown语法有了初步了解,打印出了"Hello world!" C语言l博客作 ...

  7. [转帖]FreeBSD、OpenBSD、NetBSD的区别

    FreeBSD.OpenBSD.NetBSD的区别 Linux 的历史 http://www.361way.com/unix-bsd/1513.html   一直unix在我心目中的地位都很高,uni ...

  8. CentOS 7 配置 kcptun 实现网站加速

    目的:shadowsocks+kcptun 实现vpn加速(shadowsocks,kcptun在同一台VPS上) 一.shadowsocks安装(参考  https://www.cnblogs.co ...

  9. 用data的方法获取值的时候,要注意的问题一定要在先封装好

    var art=$(".add-more").prev().find(".content").data("list1"); 我们一定要在aj ...

  10. loj 6043「雅礼集训 2017 Day7」蛐蛐国的修墙方案

    loj 爆搜? 爆搜! 先分析一下,因为我们给出的是一个排列,然后让\(i\)给\(p_i\)连边,那么我们一定会得到若干个环,最后要使得所有点度数为1,也就是这些环有完备匹配,那么最后一定全是偶环. ...