`

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)");  
    }  
}  
 
分享到:
评论

相关推荐

    java集合面试题.doc

    Java 集合是 Java 语言中最基本的数据结构之一,通过了解 Java 集合的基本概念、种类、特点、迭代器、增强 for 循环等,可以更好地掌握 Java 集合的使用方法和优化技术,从而提高编程效率和代码质量。

    视频教程:Java中的For循环语句用法精讲.rar

    Java中的For循环是编程语言中最基础且常用的控制流结构之一,尤其在处理迭代或重复任务时,它的灵活性和效率使其成为首选。这个“视频教程:Java中的For循环语句用法精讲.rar”旨在深入讲解Java中For循环的各个方面...

    Java循环结构for语句while语句详解-Java教程

    在Java中,有两种主要的循环结构:for循环和while循环,这两种循环在编写控制流程、处理数组、迭代集合等场景时非常常见。 **一、for循环** for循环是一种预定义迭代的循环结构,适用于已知循环次数的情况。基本...

    java循环语句(典型的循环语句)

    Java是一种广泛使用的面向对象的编程语言,其循环语句是编程中最基础且重要的部分,用于重复执行一段代码,直到满足特定条件为止。本篇将详细讲解Java中的典型循环语句,包括数组循环和遍历循环。 1. **for循环**:...

    Java循环语句学习例子源码

    在Java编程语言中,循环语句是不可或缺的一部分,它们用于执行特定代码块多次,直到满足某个条件为止。这里,我们有一个名为"Java循环语句学习例子源码程序"的资源,它提供了一个实际的Visita风格登录界面的实现,...

    老生常谈foreach(增强for循环)和for的区别

    在 Java 编程语言中,foreach 和 for 是两种常用的循环语句,都是用于遍历数组或集合的元素。然而,foreach 和 for 之间存在一些关键的区别,了解这些区别对于编写高效的代码非常重要。 foreach 语句,也称为增强 ...

    java各公司笔试题集合

    Java集合框架是面试中常考的部分,包括List、Set、Queue和Map接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类: 1. 集合特性:线程安全、是否允许重复元素、排序规则等。 2. 遍历方式:迭代器、增强for...

    13.foreach循环_java_

    在Java编程语言中,`foreach`循环,也称为增强型for循环或迭代器循环,是处理数组和集合数据的一种简洁高效的方式。这个小视频详细介绍了如何在Java中正确使用`foreach`循环,让我们深入探讨一下相关知识点。 首先...

    Java4Android 10_循环语句

    除了这三种基础循环结构,Java还提供了其他一些高级特性,如增强型for循环(也称为foreach或迭代器循环),用于遍历数组或集合: ```java for (类型 变量 : 集合或数组) { // 循环体 } ``` 例如,遍历数组: ```...

    foreach循环

    在实际开发中,`foreach`循环广泛应用于各种场景,如数据处理、集合操作和算法实现。例如,你可以用它来计算数组的总和、查找最大值或最小值,甚至实现更复杂的逻辑,如分组、过滤或映射数据。 总结来说,`foreach`...

    java流程控制语句练习答案

    - **增强型for循环**(foreach):遍历数组或集合。 ```java for (Type item : collection) { // 遍历collection中的每个item } ``` 3. **跳转语句** - **break**:跳出最内层的循环或switch语句。 - **...

    Java循环跳转语句之continue共2页.pdf.zi

    - **处理数组或集合中的特殊位置**:例如,你可能希望忽略数组的第一个或最后一个元素,`continue`可以帮你实现这一点。 总的来说,`continue`语句在Java编程中扮演着不可或缺的角色,它提供了更精细的控制,帮助...

    foreach用法.docx

    只要数据结构实现了迭代器接口,`foreach`就可以在其上工作,这大大提高了代码的可复用性和适应性。 4. **性能优化**:编译器通常会对`foreach`循环进行优化,使其在运行时更高效。相比于手动编写基于索引的循环,`...

    java基础核心学习笔记

    - 遍历和迭代器:使用`foreach`循环或Iterator遍历集合元素。 7. **输入/输出(I/O)** - 文件操作:使用File类进行文件的创建、删除、重命名等操作。 - 流(Stream):用于读写数据,分为字节流和字符流,如...

    Javafor循环语句使用.docx

    语句嵌套形式其实就是语句中还有语句。形式多种多样,没有固定的格式和套路。例如,打印偶数代码如下: ```java for(int x=1;x;x++){ if(x%2==1)continue; System.out.println("x="+x); } ``` 二、累加求和 累加...

    MyBatis的foreach语句详解

    MyBatis的`foreach`语句是其动态SQL功能中的一个重要组成部分,主要用于处理SQL语句中的循环和集合数据。在数据库操作中,特别是在构建`IN`条件时,`foreach`非常实用,它可以避免手动拼接SQL字符串,提高代码的...

    java循环语句_java_dugude_

    Java循环语句是编程语言中不可或缺的一部分,它们用于在满足特定条件时重复执行代码块,这对于处理迭代、遍历数组或集合以及实现复杂的算法至关重要。Java提供了多种类型的循环语句,包括for、while和do-while,每种...

    分页功能实现java

    - 原生SQL:通过在查询语句中添加LIMIT和OFFSET来实现分页。 - ORM框架:利用Hibernate或MyBatis等框架提供的分页插件或API进行分页。 对于Struts框架,可以在Action类中处理分页逻辑。Action类是Struts 2的核心...

    Java笔试题集合-常见java笔试题目

    Java笔试题集合是Java开发者在求职过程中经常遇到的一类测试,涵盖了从基础语法到高级特性的广泛知识领域。以下是一些常见的Java笔试题及其相关的知识点: 1. **基础语法** - **数据类型**:Java有八种基本数据...

    c标签-if-foreach-jar

    这个标签用于执行条件判断,类似于Java中的`if`语句。基本语法如下: ```jsp 条件表达式"&gt; &lt;!-- 当条件满足时,这里的代码将被渲染 --&gt; ``` 其中,`test`属性是一个EL(Expression Language)表达式,用于评估...

Global site tag (gtag.js) - Google Analytics