2016-03-09 3 views
0

У меня есть текстовый файл, состоящий из нескольких строк небольшого списка целых чисел, разделенных пробелами. Я должен был сканировать первую строку и делать что-то для каждого целого числа, которое находится в первой строке.Как использовать методы сканера при сканировании строки?

String lineString = textScan.nextLine(); //scans the first line of the text file. 
    Scanner Line = new Scanner(lineString); //scans the String retrieved from the text file. 

    while (Line.hasNextInt()) 
    { //do stuff 
    } 

Так у меня есть сканер (TextScan), который сканирует первую строку текстового файла, а затем сохраняет его в виде строки. Затем у меня есть второй сканер, который сканирует строку, чтобы проверить, являются ли значения в ней целыми числами.

Но оператор while не позволяет мне использовать «Line.hasNextInt» для сканирования по строке! Итак, как я просматриваю строку String, чтобы выяснить, есть ли целые числа или нет?

EDIT: Извините, моя ошибка в формулировке. Цикл будет бесконечно работать, поэтому я попытался создать оператор печати перед циклом: System.out.println (Line);, и она выводит эту ошибку:

java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false] [need input=false][source closed=false][skipped=false][group separator=\,][decim al separator=.][positive prefix=][negative prefix=\Q-\E][positive suffix=][nega tive suffix=][NaN string=\Q?\E][infinity string=\Q∞\E]

Странным является то, что он компилируется нормально?

Входной файл:

5 4 4 3 5 
4 2 2 5 3 
5 2 5 2 3 
5 4 3 2 3 
5 4 2 2 5 
4 4 2 4 2 
3 3 5 3 5 
5 2 4 5 2 
4 4 5 4 2 
2 4 3 5 2 
3 3 3 5 3 
2 4 5 3 4 
3 5 5 4 3 
3 4 2 2 4 
5 5 5 4 4 
3 4 4 4 5 
3 2 4 2 4 
5 4 4 2 4 
5 3 5 2 3 
+0

Предоставить входной файл. – Ambrish

+3

* «не позволяет мне использовать» * Что ты имеешь в виду? Есть ли сообщение об ошибке компиляции? Исключение при запуске программы?Пожалуйста, отредактируйте этот вопрос, чтобы указать конкретную проблему, с которой вы сталкиваетесь. – Radiodef

+0

*** Точно *** какой ** формат ** делает каждая строка? –

ответ

1

Я вижу проблему. Чтобы перемещать курсор, вам нужно использовать Line.nextInt() внутри цикла.

Если нет, линия всегда указывает на начало, и цикл никогда не заканчивается.

Чтобы использовать его правильно, вызовите nextInt(), так что поднимает следующий маркер:

while (Line.hasNextInt()) 
{ 
    System.out.println(Line.nextInt()); 
} 

Infinite Loop:

while (Line.hasNextInt()) 
{ 
    System.out.println("Infinity"); 
} 
+0

Ах, ты прав! Кажется, это проблема! В этом есть смысл. Есть ли способ удалить курсор на следующий объект (или удалить объект из списка строк), не распечатывая его? – Guy

+1

Да, просто вызовите метод 'Line.nextInt();'. Не нужно назначать или сохранять его значение или печатать в любом месте. внутри цикла, в качестве первого оператора вы можете вызвать Line.nextInt(), а затем продолжить обработку. Пока 'nextInt()' вызывается внутри цикла, он будет работать. Можете ли вы принять ответ и закрыть вопрос, если его решить? –

+0

О, как интересно, я понятия не имел, что вы можете это сделать! Спасибо, это два вопроса! : P О, и жаль, что я просто оставил ваш непринятый бит немного дольше, чтобы выставить свой комментарий здесь. – Guy

-1

К сожалению не понял ваш вопрос ранее в случае у вас есть несколько целых чисел в одной и той же линии, вы можете разделить их, используя разделитель и по-прежнему использовать один сканер:

String yourFilename = "filename.txt"; 

File file = new File(yourFilename).useDelimiter(" "); 
Scanner sn = new Scanner(file); 

while(sn.hasNextInt()){ 
// Do your work here 
} 
+0

Это будет читать все строки файла. То, что @Guy хочет, это прочитать только первую строку, а затем разобрать эту строку только для int. Таким образом, требуется либо 2 сканера, либо один сканер для чтения ввода, а затем он должен использовать разделение на эту строку, чтобы получить его. –

0

Вам не нужно решать эту проблему с помощью сканера.

public static void main(String[] args) { 

    String myString = "This is not int"; 
    String myInt = "123456"; 
    int copyOfInt = 0; 
    try { 
     copyOfInt = Integer.parseInt(myInt); 
     System.out.println(copyOfInt); 
     copyOfInt = Integer.parseInt(myString); 
     System.out.println(myString); 
    } catch (Exception e) { 
     System.out.println("Not int"); 
    } 
    // Put this in a loop and you can keep doing stuff 
} 

Или вы можете использовать FileInputStream, который, я думаю, лучше. Вот пример:

try (FileInputStream readFile = new FileInputStream(refFile); 
      InputStreamReader readIn = new InputStreamReader(readFile, "UTF8")) { 
     BufferedReader ReadBuffer = new BufferedReader(readIn); 
     String line = ""; 
     while ((line = ReadBuffer.readLine()) != null) { 
      // Search my string of interest 
      if (line.equals("Potential/V, Current/A")) { 
       while ((line = ReadBuffer.readLine()) != null) { 
        // Get data after string of interest 
        // Use createDataType_1_Object() to get my data 
        myDataArray.add(createDataType_1_Object(line)); 
       } 
      } 
     } 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
+0

Я думаю, что Scanner здесь намного проще. Я бы предпочел один сканер, а другой - регулярное выражение или разделение строки. Это будет намного проще, чем любое другое решение. –

+0

Я согласен с вами, я думаю, что это более личное предпочтение. –

-1

В то время как петли вам нужно поставить логическое выражение:

while(Boolean_expression) 
{ 
    //Statements 
} 

Вы не вводите String в класс Сканера в качестве параметра. Класс сканера принимает InputStream source. -> Спасибо за ваши комментарии, за мою ошибку.

+0

Что означает Java API, создавая сканер из указанной строки? https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#Scanner-java.lang.String- – Guy

+0

@Thomas Это действительно актуально. 'Сканер (источник строки)' Создает новый сканер, который производит значения, отсканированные из указанной строки. Вы можете попробовать этот образец кода, если это необходимо. 'Scanner Line = новый сканер (« 5 4 4 3 5 »);' 'while (Line.hasNextInt())' \t 'System.out.println (Line.nextInt());' –

Смежные вопросы