2015-04-16 2 views
1

В следующем коде, если coverDate является «16 июня - 29 июня 2014 года», то в конце цикла while массив дат имеет [16, 2014]. Это должно быть [16, 29, 2014]java.util.Scanner не дает правильного результата

Scanner scanner = new Scanner(coverDate); 
List<Integer> dates = new ArrayList<Integer>(); 

while(scanner.hasNext()) { 
    if (scanner.hasNextInt()) { 
     dates.add(scanner.nextInt()); 
    } else { 
     scanner.next(); 
    } 
} 

scanner.close(); 

Может ли кто-нибудь помочь мне получить желаемый результат?

+1

Просто догадка: Может быть, '29,' интерпретируется как двойная (не ИНТ) из-за запятой? –

+1

Или, может быть, как 'String' –

+0

Имеет смысл, как мне получить желаемый результат? – riship89

ответ

4

При вызове scanner.hasNextInt(), то 29 обрабатывается вдоль с запятой, то есть следующий маркер 29,. Следовательно, scanner.hasNextInt() вернет false. Это связано с тем, что разделитель является пробелом.

Один Hacky способ решить это является путем корректировки разделитель включить запятую:

scanner.useDelimiter("[\\p{javaWhitespace}+,]"); 
2

Сканер использует пробел в качестве разделителя по умолчанию. В вашем случае запятая берется с номером 29, поэтому этот токен не считается допустимым числом.

Вы можете установить разделитель с помощью useDelimiter(), который принимает регулярное выражение. Я предлагаю вам использовать \D разделитель, который выступает за «нецифры»:

Scanner scanner = new Scanner(coverDate).useDelimiter("\\D");