2010-11-26 8 views

Respuesta

4

Ver this respuesta para una solución más eficiente.

Esta es una solución muy fea, pero puede crear una clase contenedora alrededor de Scanner que conserve dos objetos internos Scanner. Puede obtener la funcionalidad peek() teniendo el segundo escáner uno delante del otro

Esta es una solución muy básica (solo para darle una idea de lo que estoy hablando) y no implementa todo lo que necesitaría (pero solo necesitaría implementar aquellas partes que usaría). (también, esto no se ha probado, así que tómalo con un grano de sal).

import java.util.Scanner; 

public class PeekableScanner 
{ 
    private Scanner scan1; 
    private Scanner scan2; 
    private String next; 

    public PeekableScanner(String source) 
    { 
     scan1 = new Scanner(source); 
     scan2 = new Scanner(source); 
     next = scan2.next(); 
    } 

    public boolean hasNext() 
    { 
     return scan1.hasNext(); 
    } 

    public String next() 
    { 
     next = (scan2.hasNext() ? scan2.next() : null); 
     return scan1.next(); 
    } 

    public String peek() 
    { 
     return next; 
    } 
} 
+0

Se me ocurre que probablemente podría hacerlo en un escáner simplemente manteniendo la referencia al objeto 'next()'. –

+0

Ok, agregué esa respuesta como otra respuesta (no quería simplemente agregarla a esto porque quería mantener esto como una posible solución). En algunos casos (si está haciendo cosas bastante complejas con sus escáneres), esto podría ser más fácil de envolver, pero la otra solución es más eficiente. –

+0

Tenga en cuenta que su constructor PeekableScanner arrojaría NoSuchElementException si la cadena estuviera vacía o solo tuviera espacio en blanco. –

8

No creo que haya un método parecido a un vistazo, pero puede usar hasNext(String) para verificar si el siguiente token es lo que está buscando.

12

Aquí hay otra solución basada en envoltura, pero esta tiene solo un escáner interno. Dejé el otro para mostrar una solución, esta es una solución diferente y probablemente mejor. Nuevamente, esta solución no implementa todo (y no se ha probado), pero solo deberá implementar aquellas partes que pretenda usar.

En esta versión, mantendría una referencia de lo que realmente es next().

import java.util.Scanner; 

public class PeekableScanner 
{ 
    private Scanner scan; 
    private String next; 

    public PeekableScanner(String source) 
    { 
     scan = new Scanner(source); 
     next = (scan.hasNext() ? scan.next() : null); 
    } 

    public boolean hasNext() 
    { 
     return (next != null); 
    } 

    public String next() 
    { 
     String current = next; 
     next = (scan.hasNext() ? scan.next() : null); 
     return current; 
    } 

    public String peek() 
    { 
     return next; 
    } 
} 
0

si el iterador es un ListIterator se puede hacer algo como esto:

if(it.hasNext()) { 
    if(it.next() ... 
    it.previous(); 
} 
Cuestiones relacionadas