2016-09-30 3 views
1

Я читаю файл с таким шаблоном: (section1, section2, section3) ... Но формат не гарантируется, а это значит, что я должен обрабатывать случаи как один раздел на отдельных строках, много секций на одной строке. И мне также нужно сохранить смещение каждого токена. Так я бег кода, как это, используя Искатель, потому что это дает коррекции и жетоны:Матчи в java, поведение сопряжения в цикле while?

`define a global matcher 
while() { 
    readSection1(matcher, other parameters); 
    readSection2(matcher, other parameters); 
    readSection3(matcher, other parameters); 
} 

Вы можете видеть, что я пытаюсь передать этот Искатель, так что я могу начать оттуда, где я остановился. Но теперь у меня проблема. После того, как мой последний метод readSection3 закончился, я проверил, что мой помощник не попал в цель, поэтому я начал новый раунд чтения. Однако, когда я снова вошел в цикл while и передал матчи методу readSection1, помощник внезапно попал в конец! Почему это произойдет?

Я также запустить небольшой тест:

String loop = "a b c d e f g h i j k l"; 
Matcher loopMatcher = Pattern.compile("\\S+").matcher(loop); 
boolean loopEnded = false; 
while (!loopEnded) { 
use(loopMatcher); 
    if (loopMatcher.hitEnd()) { 
     loopEnded = true; 
    } 
} 

public static void use(Matcher matcher) { 
    if (!matcher.find()) { 
    System.out.println("loop not ended but matcher hit end"); 
    } 
} 

печатает сообщение об ошибке тоже. Зачем?!

Хорошо, странно, сейчас я снова запускаю эту маленькую программу, ошибка ушла, но она все еще в моей большой программе.

ответ

0

Похоже, что метод Matcher.hitEnd() возвращает true, если последняя строка, найденная соглашением, находится в конце ввода. Поэтому, если у вас есть символы после последнего раздела вашего файла, Matcher.hitEnd() вернет false, даже если это фактически последний раздел.

Однако я запустил ваш тестовый код и не отобразил сообщение об ошибке. Вы уверены, что вы отправили тот же код, что и ваш тест? Соединитель, который вы используете, не тот, который вы сначала инициализировали ('loopMatcher' vs 'matcher').

+0

Возможно, я не очень хорошо объяснил это. Я фактически работаю на линиях с помощью сканера, на самом деле нет класса Section. И шаблон S1, S2, S3, S1, S2, S3 ... Когда мой readSection3() заканчивается, я должен перейти в следующий цикл и прочитать следующий S1, если он есть. Поэтому, если последний S3 и следующий S1 находятся в одной строке, мне нужно будет начать с того места, где я остановился. Вот почему я передаю свой Matcher, потому что он должен был остаться на последнем знаке последнего S3. И когда я перехожу в следующий цикл и вызываю readSection1(), я вызываю matcher.find(), что Matcher должен найти следующий токен, который принадлежит разделу1. – HM9527

+0

Вы правы, что в моем коде есть опечатка, теперь она должна бежать. Но подождите, я пытаюсь запустить его снова, и теперь все хорошо ????? Что я только что исправил с помощью глобального Matcher !!! Что я трачу на то, чтобы исправить это, если он зафиксировал себя после 40 минут ???? – HM9527

+0

Однако, если я не использую фиксированную версию, моя другая программа по-прежнему идет не так ... Хм, позвольте мне пройти через это снова. – HM9527