`

Java集合中迭代实现(foreach语句)

阅读更多

  对于集合的一个基本的操作利用foreach语句遍历集合以处理集合中的每个元素。看下面的代码:

// 下面是关于foreach语句的使用,代码非常简洁和紧凑
Stack<String> collection = new Stack<String>();
// ....
for (String s : collection) {
    System.out.println(s);
}
// ...

// 下面使用while语句来代替上面的foreach语句来实现相同的功能
Stack<String> collection = new Stack<String>();
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

  上面的代码说明为了使用foreach语句我们必须实现可迭代的集合,在Java中就是实现Iterable<T>接口:

// java.lang.Iterable
public interface Iterable<T> {
    Iterator<T> iterator();
}

 其实,我们要实现的有两个方面:(1)集合必须实现iterator()方法,并返回一个Iterator(这在Java中也是个接口)对象。(2)Iterator类必须包括两个方法:1.hasNext(),返回一个布尔值。2.next(),返回集合中的一个元素。下面是一个例子:

import java.util.Iterator;  
import java.util.NoSuchElementException;  
public class Stack<E> implements Iterable<E>   
{  
    private int size; // size of the stack  
    private Node first; // top of stack  
      
    // helper linked list class  
    private class Node  
    {  
        private E element;  
        private Node next;  
    }  
    // create an empty stack  
    public Stack() {  
        size = 0;  
        first = null;  
        assert check();  
    }  
    // Is the stack empty?  
    public boolean isEmpty() {  
        return (first == null);  
    }  
    // return the number of items in the stack  
    public int size() {  
        return size;  
    }  
  
     /* 
     Add the element to the stack. 
     */  
     public void push(E element) {  
         Node oldfirst = first;  
         first = new Node();  
         first.element = element;  
         first.next = oldfirst;  
         size++;  
         assert check();  
     }  
     /* 
     Delete and return the item most recently added to the stack. 
     @throws java.util.NoSuchElementException if the stack is Empty 
     */  
  
     public E pop() {  
         if (isEmpty())  
         {  
             throw new NoSuchElementException("Stack underflow");  
         }  
         E element = first.element;  // save  element to return   
         first = first.next;   // delete first node  
         size--;  
         assert check();  
         return element; // return the saved element  
     }  
  
     /* 
     Return the element most recently added to the stack. 
     @throws java.util.NoSuchElementException if stack is Empty. 
     */  
     public E peek() {  
         if (isEmpty())  
         {  
             throw new NoSuchElementException("Stack underflow");  
         }  
         return first.element;  
     }  
  
    /* 
     Return string representation. 
    */  
  
    public String toString() {  
        StringBuilder sb = new StringBuilder();  
        for (E element: this)  
        {  
            sb.append(element + "-");  
        }  
        return sb.toString();  
    }  
  
    /* check internal invariants */  
    private boolean check() {  
        if (size == 0)  
        {  
            if (first != null)  
            {  
                return false;  
            }  
        }  
  
        return true;  
    }  
    /* return an iterator to the stack that iterates 
     through the elemets in LIFO order */  
    public Iterator<E> iterator() {  
        return new ListIterator();  
    }  
    // an iterator,doesn't implement remove() since it's optional  
    private class ListIterator implements Iterator<E> {  
        private Node current = first;  
        public boolean hasNext() {  
            return current != null;  
        }  
  
        public void remove() {  
            throw new UnsupportedOperationException();  
        }  
  
        public E next() {  
            if (!hasNext()) {  
               throw new NoSuchElementException();   
            }  
            E element = current.element;  
            current = current.next;  
  
            return element;  
        }  
    }  
  
    public static void main(String[] args)   
    {  
        Stack<String> s = new Stack<String>();  
        while (!StdIn.isEmpty())  
        {  
            String element = StdIn.readString();  
            if (!element.equals("-"))  
            {  
                s.push(element);  
            }else if(!s.isEmpty()) {  
                StdOut.print(s.pop() + " ");  
            }  
        }  
  
        StdOut.println("(" + s.size() + "left on stack)");  
    }  
}  
 
分享到:
评论

相关推荐

    【03-流程控制与数组】

    ◆switch语句中控制表达式的类型只能是byte、short、char、int、String(JDK7新增)和枚举 Switch语句容易导致的错误 •switch语句后的expression表达式的数据类型只能是byte、short、char、int、String...

    开发专家·编程大讲坛:C#核心开发技术从入门到精通.tag.pdf

    依次讲解了C#开发基础、搭建C#开发环境、变量与常量、复杂的变量类型和.NET框架类、表达式和运算符、流程控制语句、面向对象编程技术基础、方法、C#类、C#集合、数组和集合类、foreach语句、自定义集合类和迭代器、...

    突破程序员基本功的16课.part2

    第3课 常见Java集合的实现细节 3.1 Set和Map 3.1.1 Set和Map的关系 3.1.2 HashMap和HashSet 3.1.3 TreeMap和TreeSet 3.2 Map和List 3.2.1 Map的values()方法 3.2.2 Map和List的关系 3.3 ArrayList和...

    springmybatis

    MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...

    c#学习笔记.txt

    (1) foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。此语句的形式如下: foreach (type ...

    Java学习笔记-个人整理的

    {4.7}集合的迭代(Iterator)}{85}{section.4.7} {4.8}Collections集合工具类}{86}{section.4.8} {4.9}Comparable与Comparator}{86}{section.4.9} {4.9.1}Comparable}{86}{subsection.4.9.1} {4.9.2}Comparator...

    EL表达式 (详解)

    4) 1--EL表达式用${}表示,可用在所有的HTML和JSP标签中作用是代替JSP页面中复杂的JAVA代码. 2--EL表达式可操作常量 变量 和隐式对象. 最常用的 隐式对象有${param}和${paramValues}. ${param}表示返回请求参数...

    在一小时内学会 C#(txt版本)

    和 C++ 有所区别的是,C# 中没有单独的声明(头)和实现(CPP)文件。所有代码(类声明和实现)都放在扩展名为 cs 的单一文件中。 看看 C# 中的 Hello World 程序。 复制内容到剪贴板 代码: using System; ...

    scala从入门到精通技术教学视频

    22.使用迭代器遍历集合 23.函数式编程之foreach 24.函数式编程之简化函数定义 25.函数式编程之映射 26.函数式编程之扁平化映射 27.函数式编程之过滤 28.函数式编程之默认排序 29.函数式编程之指定字段排序 ...

Global site tag (gtag.js) - Google Analytics