之前初学时看过可以实现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. [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程 V0.2

    之前的[笔记] 基于nvidia/cuda的深度学习基础镜像构建流程已经Out了,以这篇为准. 基于NVidia官方的nvidia/cuda image,构建适用于Deep Learning的基础im ...

  2. Python:Base1(数据类型,print语句,变量,定义字符串,raw字符串与多行字符串,Unicode字符串,整数和浮点数运算,布尔类型运算)

    1.Python中数据类型: 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据 ...

  3. python网络编程(Socket、TCP、UDP)

    Socket 是网络编程的一个抽象概念,通常我们用一个Socket表示 "打开了一个网络链接",而打开一个Socket 需要知道目标计算机的IP 地址和端口号,再指定协议类型即可. ...

  4. django在进行模板render(渲染)时,对传过来的是字典中包含字典应用方法

    网上自强学堂参考的 views.py def home(request): info_dict = {'site': u'自强学堂', 'content': u'各种IT技术教程'} return r ...

  5. 利用netsh命令设置IP地址/DNS服务器地址

    一.设置IP地址 1. 自动获取IP地址: netsh interface ip set address [name=]"本地连接" [source=]dhcp 2. 手动设置IP ...

  6. XCTF (app2)

    打开app,有两个输入框和一个按钮.点击按钮会跳转到新的页面显示Waiting for you. 打开JEB反编译. 如果两个输入框的长度都不为0,那么获取这两个值到v0和v1中,Log记录日志. 创 ...

  7. MSF魔鬼训练营-3.5.3 MSF中常用的关于数据库的命令

    渗透测试数据库用来保存渗透测试过程中获取的各种数据,很多时候你重启了kali发现连接不上数据库了,其实就是因为这个服务没开 MSF所使用的数据库时postgresql root@kali:/# ser ...

  8. mybatis 基础(二) CRUD中的关键点

    今日学习中遇见几个问题 关于mybatis foreach的几种情况 1.当我需要传入多个参数的时候,可以将参数封装进map集合中(一般来说是针对一个对象而言的,比如user中的username,ge ...

  9. Python模拟进度条

    import time for i in range(0,101,2) time.sleep(0.2) num = i // 2 per = '\r %s %% : %s'%(i,'*'*num) p ...

  10. 如何用纯 CSS 创作一个菜单反色填充特效

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览.https://codepen.io/comehope/pen/qYMoPo 可交互视频教程 ...