Я хочу прочитать ввод из файла с помощью сканера, но я хочу, чтобы сканер игнорировал все внутри (*....... *). Как мне это сделать? Я беру целые числа и добавляю их в список массивов, но если в тексте есть целые числа, которые я хочу игнорировать, это тоже добавляет их.
public ArrayList<Integer> readNumbers(Scanner sc)
{
// TODO Implement readNumbers
ArrayList<Integer> list = new ArrayList<Integer>();
while(sc.hasNext())
{
try
{
String temp = sc.next();
list.add(Integer.parseInt(temp));
}
catch(Exception e)
{
}
}
return list;
}
Здесь пример строки текстового файла
(* 21 население Алабамы в 2013 году *) 4802740
Я бы добавил 21 и 4802740 в список массивов. Я думал об использовании sc.useelimiter("("); sc.usedelimiter(")"); Но я просто не могу заставить его работать. Благодарю!
Кажется, что вы можете искать что-то вроде
sc.useDelimiter("\\(\\*[^*]*\\*\\)|\\s+");
Это регулярное выражение \\(\\*[^*]*\\*\\)
представляет собой часть, которая
\\(\\*
- начинается с (*
,\\*\\)
- заканчивается на *)
[^*]*
- и имеют ноль или больше не *
символов внутри. Я также добавил |\\s+
чтобы позволить одному или нескольким пробелам быть разделителем (по умолчанию этот разделитель используется сканерами).
Кстати, использование try-catch в качестве основной части потока управления обычно считается неправильным. Вместо этого вы должны изменить свой код на что-то вроде
while (sc.hasNext()) {
if(sc.hasNextInt()) {
list.add(sc.nextInt());
} else {
//consume data you are not interested in
//so Scanner could move on to next tokens
sc.next();
}
}
Пропустите "(* string *)" перед чтением следующего int:
try
{
try {
sc.skip("\\s*\\(\\*[^*]*\\*\\)");
} catch (NoSuchElementException e) {
}
String temp = sc.next();
list.add(Integer.parseInt(temp));
} catch (Exception e) {
}
*
in(*...*)
часть, кроме тех, что начинаются или заканчиваются?