2015-02-27 2 views
0

Я хочу построить буффер вперед буфера, основываясь на текущем состоянии java.util.Scanner. Под этим я имею в виду, если вы думаете о сканере как конвейерной ленте, которая поставляет «слова», «текущее состояние» сканера будет словами, остающимися на конвейерной ленте.Возможно ли создать lookAheadBuffer из java.util.Scanner?

Я думал, что смогу это сделать, построив еще один временный сканер, в котором хранилось текущее состояние исходного сканера. Затем я мог бы использовать getNext() для заполнения буфера поиска вперед от временного сканера и не влиять на состояние исходного сканера.

К сожалению, нет конструктора или метода, который обеспечивает текущее состояние исходного сканера по мере необходимости.

Возможно ли создать внешний вид буфера Ahead от текущего состояния сканера?

+0

Предлагаю вам прочитать Сканер один раз. Он предназначен для взаимодействия с пользователями среди других вещей, и я сомневаюсь, что вы хотите спросить у пользователя, что они хотят напечатать, прежде чем вводить его. –

+0

Я согласен с Питером: сканер потребляет входные потоки, и он будет постоянно продвигать состояние базового потока, если он вызывает массовое чтение, чтобы заполнить свой собственный внутренний буфер. Я не вижу, как эта идея может (разумно) работать. – markspace

+0

Может быть, я не сделал свою цель ясной. Я создаю сканер из документа, а не потока. Мне нужно смотреть вперёд на текущую позицию сканера, но не изменять состояние исходного сканера, т. Е. Не вызывать getNext() на исходном сканере. – user903724

ответ

0

Поскольку большинство ответов ясно дали понять, сканер не имеет возможности смотреть в будущее. В случае, если кого-то интересует, вот как я это сделал. Эти три метода относятся к классу ScannableDocument.

/** 
    * Return the next word in the document. Just a wrapper for Scanner and look ahead buffer methods. 
    * The caller does not have to call hasNext(). 
    * The caller does have to catch DocumentExhaustedException. 
    * @return next word from scanner 
    * @throws DocumentExhaustedException 
    */ 
public String getNextWord() throws DocumentExhaustedException { 

     // if the lookAheadBuffer is not empty, return its first element (fifo queue) instead of moving the scanner 
     if (!lookAheadBuffer.isEmpty()) { 
      return lookAheadBuffer.removeFirst() ; 
     } else { 
      if (scanner.hasNext()) { 
       return scanner.next(); 
      } else { 
       throw new DocumentExhaustedException("ScannableDocument.getNextWord()") ; 
      } 
     } 
    } 

    /** 
    * Move numWords off of the conveyer. 
    * @param numWords 
    * @throws DocumentExhaustedException 
    */ 
    public void advanceConveyer (int numWords) throws DocumentExhaustedException { 
     for (int word=1; word<=numWords ; word++) { 
      getNextWord() ; 
     } 
    } 


    /** 
    * The look ahead buffer is used to recognize patterns in the document that start with the 'current' word 
    * The patterns come from a dictionary. The look ahead buffer is loaded 
    * with dictionaryEntry.size() words to enable a String comparison. 

    * @param numWords 
    */ 
    public void loadLookAheadBuffer (int numWords) throws DocumentExhaustedException { 

     if (lookAheadBuffer.size() >= numWords) return ; // Already have enough words in the buffer 

     for (int i=1; i<=(numWords-lookAheadBuffer.size()) ; i++) { 
      if (scanner.hasNext()) { 
       lookAheadBuffer.add (scanner.next()) ; 
      } else { 
       throw new DocumentExhaustedException("ScannableDocument.loadLookAheadBuffer()") ; 
      } 
     } 
    } 
Смежные вопросы