Chinaunix首页 | 论坛 | 博客
  • 博客访问: 91782
  • 博文数量: 81
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1007
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 14:50
文章分类

全部博文(81)

文章存档

2014年(21)

2013年(60)

我的朋友

分类: Java

2013-12-27 11:42:35

  1.迭代器设计

  迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。

  一般的迭代器对外提供的接口有:

  [1]检查是否至序列末端;

  [2]返回当前的对象;

  [3]过渡到下一个对象。

  我们基于以上三点,提供一个迭代器Interface。

  <>MyIterator.java

  package com.zj.iterator;

  public interface MyIterator {

  boolean end();

  T current();

  void next();

  }

  接下来,设计一个序列,并部署上面设计的迭代器。我们使用一个ArrayList作为底层的数据结构,设计一个内部类LinksIterator来实现MyIterator接口,这样可以提供迭代器功能。通过public MyIterator browser()方法返回该迭代器的实例。

  Links.java

  package com.zj.iterator;

  import java.util.ArrayList;

  import java.util.List;

  public class Links {

  private List items = new ArrayList();

  public void add(T x) {

  items.add(x);

  }

  private class LinksIterator implements MyIterator {

  private int i = 0;

  public boolean end() {

  return i == items.size();

  }

  public T current() {

  return items.get(i);

  }

  public void next() {

  if (i < items.size())

  i++;

  }

  }

  public MyIterator browser() {

  return new LinksIterator();

  }

  public static void main(String[] args) {

  Links links = new Links();

  for (int i = 1; i < 6; i++)

  links.add(i);

  // use MyIterator

  MyIterator myItr = links.browser();

  while (!myItr.end()) {

  System.out.print(myItr.current() + " ");

  myItr.next();

  }

  }

  }

  在Link2.java中,我们使用一个匿名内部类替代Links.java中内部类的设计。

  Links2.java

  package com.zj.iterator;

  import java.util.ArrayList;

  import java.util.List;

  public class Links2 {

  private List items = new ArrayList();

  public void add(T x) {

  items.add(x);

  }

  public MyIterator browser() {

  return new MyIterator() {

  private int i = 0;

  public boolean end() {

  return i == items.size();

  }

  public T current() {

  return items.get(i);

  }

  public void next() {

  if (i < items.size())

  i++;

  }

  };

  }

  public static void main(String[] args) {

  Links2 links = new Links2();

  for (int i = 1; i < 6; i++)

  links.add(i);

  // use MyIterator

  MyIterator myItr = links.browser();

  while (!myItr.end()) {

  System.out.print(myItr.current() + " ");

  myItr.next();

  }

  }

  }

  2.使用Java提供的迭代器

  Java提供一个专门的迭代器<>Iterator,我们可以对某个序列实现该interface,来提供标准的Java迭代器。

  <>Iterator.java

  package java.util;

  public interface Iterator {

  boolean hasNext();

  E next();

  void remove();

  }

  我们在Links2.java的基础上,重新设计并使用实现标准的Iterator接口方法。

  Links3.java

  package com.zj.iterator.standard;

  import java.util.ArrayList;

  import java.util.Iterator;

  import java.util.List;

  public class Links3 {

  private List items = new ArrayList();

  public void add(T x) {

  items.add(x);

  }

  public Iterator iterator() {

  return new Iterator() {

  private int index = 0;

  public boolean hasNext() {

  return index < items.size();

  }

  public T next() {

  return items.get(index++);

  }

  public void remove() { // Not implemented

  throw new UnsupportedOperationException();

  }

  };

  }

  public static void main(String[] args) {

  Links3 links = new Links3();

  for (int i = 1; i < 6; i++)

  links.add(i);

  // use Standard Iterator

  Iterator myItr = links.iterator();

  while (myItr.hasNext())

  System.out.print(myItr.next() + " ");

  }

  }

  3.Java迭代器与Foreach语法

  Java中还提供了一个Iterable接口,该接口要求提供一个标准的Iterator实现。

  <>Iterable.java

  package java.lang;

  import java.util.Iterator;

  public interface Iterable {

  Iterator iterator();

  }

  只要实现了该接口,就可以通过Foreach语法遍历你的底层序列。Links4.java实现了Iterable接口,则就可以使用Foreach语法遍历它的底层序列。

  Links4.java

  package com.zj.iterator.standard;

  import java.util.ArrayList;

  import java.util.Iterator;

  import java.util.List;

  public class Links4 implements Iterable {

  private List items = new ArrayList();

  public void add(T x) {

  items.add(x);

  }

  public Iterator iterator() {

  return new Iterator() {

  private int index = 0;

  public boolean hasNext() {

  return index < items.size();

  }

  public T next() {

  return items.get(index++);

  }

  public void remove() { // Not implemented

  throw new UnsupportedOperationException();

  }

  };

  }

  public static void main(String[] args) {

  Links4 links = new Links4();

  for (int i = 1; i < 6; i++)

  links.add(i);

  // use Foreach

  for (Integer integer : links)

  System.out.print(integer + " ");

  }

  }

  你也可以提供该接口的多个不同的实现,基于此来提供多个不同功能的迭代器。Links5.java中提供了两种不同功能的迭代器,除了常规的顺序遍历迭代器外,还提供一个遍历偶序号元素的迭代器。

  Links5.java

  package com.zj.iterator.standard;

  import java.util.ArrayList;

  import java.util.Iterator;

  import java.util.List;

  public class Links5 implements Iterable {

  private List items = new ArrayList();

  public void add(T x) {

  items.add(x);

  }

  public Iterator iterator() {

  return new Iterator() {

  private int index = 0;

  public boolean hasNext() {

  return index < items.size();

  }

  public T next() {

  return items.get(index++);

  }sdudd1227

  public void remove() { // Not implemented

  throw new UnsupportedOperationException();

  }

  };

  }

  public Iterable even() {

  return new Iterable() {

  public Iterator iterator() {

  return new Iterator() {

  private int index = 0;

  public boolean hasNext() {

  return index < items.size();

  }

  public T next() {

  index += 2;

  return items.get(index - 2);

  }

  public void remove() { // Not implemented

  throw new UnsupportedOperationException();

  }

  };

  }

  };

  }

  public static void main(String[] args) {

  Links5 links = new Links5();

  for (int i = 1; i < 6; i++)

  links.add(i);

  // use Foreach default

  for (Integer integer : links)

  System.out.print(integer + " ");

  System.out.println();

  // use Foreach even

  for (Integer integer : links.even())

  System.out.print(integer + " ");

  }

  }

阅读(176) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~