之前初学时看过可以实现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. MySQL随机字符串函数批量插入数据

      简单举个例子: drop table if exists demo1 create table demo1 ( id int primary key auto_increment, name ) ...

  2. .Net Core Linux部署

    .Net Core是微软最新的开源框架跨平台框架 官网文档 .Net Core相关发布指令,以及发布RId便于查看 RID链接 .Net Core要想发布到Linux有俩种方案,分别是依赖框架的部署( ...

  3. Java利用PushbackReader实现返回对文本中的指定字符串之前的内容

    import java.io.FileReader; import java.io.PushbackReader; public class PushbackTest { public static ...

  4. Markdown用法说明(用此篇博客做示例)

    一份好的博客文档离不开一个优秀的编辑器.借此篇文章介绍一下编写该博客markdown的语法,后续再增加介绍其他语法,方便大家写出更好更漂亮的文档.点击左上角github,有主题源码哦 一份好的博客文档 ...

  5. Akka入门

    原文:http://doc.akka.io/docs/akka/2.3.6/intro/getting-started.html 预备知识 AKKA要求你的计算机已经安装了Java1.6或更高版本. ...

  6. 树莓派3 安装kali注意事项(无需显示器、键鼠连接树莓派)2017/9/18更新

     kali系统树莓派专用版下载地址https://www.offensive-security.com/kali-linux-arm-images/ 官方下载页面https://www.kali.or ...

  7. 第四周课程总结&试验报告2

    试验报告2 写一个名为Rectangle的类表示矩形.其属性包括宽width.高height和颜色color,width和height都是double型的,而color则是String类型的.要求该类 ...

  8. Python操作 RabbitMQ、Redis、Memcache

    Python操作 RabbitMQ.Redis.Memcache Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数 ...

  9. PLSQL中查到的数据和程序中查询到的不一样

    1.首先看下你的修改或者新增的SQL是否提交.

  10. kafka安装使用配置1.1

    官方文档 rz上传到/usr/local/下 解压 tar xzvf 文件 改名 mv 文件 名字 环境变量 vi /etc/profile export KAFKA_HOME=/usr/local/ ...