NextLine consumes from the input cursor to the next \n



Yüklə 0,79 Mb.
tarix30.10.2018
ölçüsü0,79 Mb.
#76741



  • nextLine consumes from the input cursor to the next \n .

    • Scanner input = new Scanner(new File(""));
    • while (input.hasNextLine()) {
    • String line = input.nextLine();

    • ;
    • }


public class Hours {

  • public class Hours {

  • public static void main(String[] args)

  • throws FileNotFoundException {

  • Scanner input = new Scanner(new File("hours.txt"));

  • while (input.hasNextLine()) {

  • String line = input.nextLine();

  • int id = line.nextInt(); // e.g. 456

  • String name = line.nextLine(); // e.g. "Greg"

  • double sum = 0.0;

  • int count = 0;

  • while (line.hasNextDouble()) {

  • sum = sum + line.nextDouble();

  • count++;

  • }

  • double average = sum / count;

  • System.out.println(name + " (ID#" + id + ") worked " +

  • sum + " hours (" + average + " hours/day)");

  • }

  • }

  • }



public class Hours {

  • public class Hours {

  • public static void main(String[] args)

  • throws FileNotFoundException {

  • Scanner input = new Scanner(new File("hours.txt"));

  • while (input.hasNextLine()) {

  • String line = input.nextLine();

  • Scanner tokens = new Scanner(line);

  • int id = tokens.nextInt(); // e.g. 456

  • String name = tokens.next(); // e.g. "Greg"

  • double sum = 0.0;

  • int count = 0;

  • while (tokens.hasNextDouble()) {

  • sum = sum + tokens.nextDouble();

  • count++;

  • }

  • double average = sum / count;

  • System.out.println(name + " (ID#" + id + ") worked " +

  • sum + " hours (" + average + " hours/day)");

  • }

  • }

  • }



A String Scanner can tokenize each line of a file.

  • A String Scanner can tokenize each line of a file.

    • Scanner input = new Scanner(new File("filename"));
    • while (input.hasNextLine()) {
    • String line = input.nextLine();
    • Scanner tokens = new Scanner(line);

    • ;
    • }


collapseSpaces exercise

  • Write a method collapeSpaces that accepts a file Scanner and writes that file's text to the console, with multiple spaces/tabs between words reduced to a single space.



Exercise solution

  • public static void collapseSpaces(Scanner input) {

  • while (input.hasNextLine()) {

  • String line = input.nextLine();

  • Scanner words = new Scanner(line);

  • if (words.hasNext()) {

  • System.out.print(words.next());

  • while (words.hasNext()) {

  • System.out.print(" " + words.next());

  • }

  • }

  • System.out.println();

  • }

  • }



leetSpeak exercise

  • Write a method leetSpeak that accepts two parameters:

  • Convert the input file's text to "leet speak", where various letters are replaced by other letters/numbers. Output the leet version of the text to the given output file.

    • Preserve the original line breaks from the input.
    • Wrap each word of input in parentheses.
  • // example call

  • Scanner input = new Scanner(new File("lincoln.txt"));

  • PrintStream output = new PrintStream(new File("leet.txt"));

  • leetSpeak(input, output);



1337-speak replacements



Exercise solution

  • public static void leetSpeak(Scanner input, PrintStream output) {

  • while (input.hasNextLine()) {

  • String line = input.nextLine();

  • Scanner lineScanner = new Scanner(line);

  • while (lineScanner.hasNext()) {

  • String word = lineScanner.next();

  • word = word.replace("o", "0");

  • word = word.replace("l", "1");

  • word = word.replace("e", "3");

  • word = word.replace("a", "4");

  • word = word.replace("t", "7");

  • if (word.endsWith("s")) {

  • word = word.substring(0, word.length() - 1) + "Z";

  • }

  • output.print("(" + word + ") ");

  • }

  • output.println(); // preserve line breaks

  • }

  • }



Using nextLine in conjunction with the token-based methods on the same Scanner can cause bad results.

  • Using nextLine in conjunction with the token-based methods on the same Scanner can cause bad results.

    • 23 3.14 Joe "Hello world" 45.2 19
    • You'd think you could read 23 and 3.14 with nextInt and nextDouble, then read Joe "Hello world" with nextLine .
    • System.out.println(input.nextInt()); // 23
    • System.out.println(input.nextDouble()); // 3.14
    • System.out.println(input.nextLine()); //
    • But the nextLine call produces no output! Why?


Don't read both tokens and lines from the same Scanner:

  • Don't read both tokens and lines from the same Scanner:

  • 23 3.14 Joe "Hello world" 45.2 19

  • input.nextInt() // 23 23\t3.14\nJoe\t"Hello world"\n\t\t45.2 19\n ^

  • input.nextDouble() // 3.14 23\t3.14\nJoe\t"Hello world"\n\t\t45.2 19\n ^

  • input.nextLine() // "" (empty!) 23\t3.14\nJoe\t"Hello world"\n\t\t45.2 19\n ^

  • input.nextLine() // "Joe\t\"Hello world\"" 23\t3.14\nJoe\t"Hello world"\n\t\t45.2 19\n ^



Scanner console = new Scanner(System.in);

    • Scanner console = new Scanner(System.in);
    • System.out.print("Enter your age: ");
    • int age = console.nextInt();
    • System.out.print("Now enter your name: ");
    • String name = console.nextLine();
    • System.out.println(name + " is " + age + " years old.");
  • Log of execution (user input underlined):

    • Enter your age: 12
    • Now enter your name: Sideshow Bob
    • is 12 years old.
  • Why?

    • Overall input: 12\nSideshow Bob
    • After nextInt(): 12\nSideshow Bob ^
    • After nextLine(): 12\nSideshow Bob ^


Yüklə 0,79 Mb.

Dostları ilə paylaş:




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə