2010-11-26 6 views
10

つまり、イテレータを削除せずにイテレータの次の要素を取得するにはどうすればよいですか?私はコンテンツに応じて削除したい場合もあれば、削除したくない場合もあるためです。私はスキャナのnext()メソッドを使ってXMLタグを繰り返し処理するファイルスキャナを持っています。Java Scannerの次の要素を「覗く」方法はありますか?

ありがとうございます。

答えて

4

より効率的な解決方法はthisを参照してください。

これは非常に醜い解決策ですが、Scannerの周りに2つの内部Scannerオブジェクトを保持するラッパークラスを作成することができます。 peek()の機能を得るには

これは非常に基本的な解決策です(私が話していることを理解するだけです)。必要なものはすべて実装していません(ただし、使用する部分のみを実装する必要があります)。 (また、これはテストされていないので、塩の粒でそれを取る)。

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

あなたがおそらくそれを行うことができることを私に起こりますあるスキャナで 'next()'オブジェクトへの参照を保持するだけです。 –

+0

これを別の答えとして追加しました(これを1つの解決策として保持したいので、これを単にこれに追加したくありませんでした)。スキャナでかなり複雑な作業を行っている場合は、折り返しが簡単な場合もあれば、効率的な解決方法もあります。 –

+0

PeekableScannerコンストラクタは、文字列が空であるか空白のみを含む場合はNoSuchElementExceptionをスローします。 –

8

私はpeekのような方法はないと思いますが、hasNext(String)を使って次のトークンがあなたが探しているものかどうかを確認できます。

12

ここには別のラッパーベースのソリューションがありますが、これには内部スキャナが1つしかありません。私は他の人に1つの解決策を提示するようにしました。これは違った、おそらくより良い解決策です。ここでも、このソリューションはすべてを実装するわけではなく(テストされていませんが)、使用する部分のみを実装する必要があります。

このバージョンでは、next()が実際に何であるかを参照してください。イテレータは、あなたがこのような何かを行うことができます反復子がある場合は https://code.google.com/p/guava-libraries/wiki/CollectionHelpersExplained#PeekingIterator

5

if(it.hasNext()) { 
    if(it.next() ... 
    it.previous(); 
} 
+1

Guavaの「PeekingIterator」は、ここで最も洗練されたソリューションです。高速で、十分にテストされており、本質的にOPの問題に対する単一行の解決策です。 – Augustin

0

:GoogleのグアバでPeekingIteratorがあり

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; 
    } 
} 
関連する問題