Можно ли установить положение Java CharBuffer? - PullRequest
3 голосов
/ 23 ноября 2011

Немного засыпки в том, что я пытаюсь сделать.

Я хочу проанализировать строку, но для возможности сравнения, например

  • 1 символ в позиции x
  • 2 символа в позиции x
  • ...
  • n символов в позиции x

если это не так

  • 1 символ в позиции x + 1
  • 2 символа в позиции x + 1
  • ...
  • n символов в позиции x + 1

и т.д.

продолжается, пока я не получу совпадение, или EOS.

Это легко сделать с массивом, но я хочу сделать это в методе и вернуть буфер с индексом, указывающим на следующее место для начала обработки. Меня убедили, что CharBuffer - хорошее решение для этого, но я не уверен.

РЕДАКТИРОВАТЬ в качестве примера - не совсем компилируемый код!

Main

List template1 = new List();
List template2 = new List();
String exampleInput = "oneone two";

template1.add ( "one" );
template1.add ( "two" );
template1.add ( "three" );

template2.add ( "one" );
template2.add ( "one" );
template2.add ( "two" );

Set templates = new Set();
templates.add ( template1 );
templates.add ( template2 );

NoisyParser np = new NoisyParser();
np.parse( templates, exampleInput );

NoisyParser

void parse( Set templates, Sting inp ){
     iterate over each template that matches inp{
        find_match( template, inp );
     }
}

boolean find_match( template, inp ) {
    This is where I need the magic to work out if the current element
    in template matches the current position of inp, or inp+1, give or take.
}

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011

CharBuffer имеет внутренний индекс, из которого вы можете делать относительные чтения, так что да, это должно соответствовать вашим критериям.

Вы устанавливаете позицию, используя (унаследованный) метод Buffer.position(int newPosition).

Вы также можете mark позицию и reset до предыдущей отметки.


Поскольку классы из пакета NIO обычно используются для ввода-вывода (и используются для него), я рекомендую вам рассмотреть завершение char[] и int pos в классе:

class PositionableCharArray {
    int pos;
    char[] chars;

    ...
    public void setPos(int pos) { ... }
    public char readChar() { return chars[pos++]; }
}
1 голос
/ 23 ноября 2011

Ну, вы могли бы реализовать это, используя Buffer.charAt(int) для получения символов относительно текущей позиции и Buffer.get() для продвижения текущей позиции. Или вы можете использовать операции Buffer для управления позицией.

Но я думаю, что вам лучше реализовать собственный класс, который читает символы в char[] (или String) и предоставляет методы для выполнения необходимых примитивных операций. Вы можете получить более эффективное решение, используя CharBuffer, но есть вероятность, что это не будет узким местом в производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...