【问题标题】:JAVA: How to read CLI strings and number with ScannerJAVA:如何使用 Scanner 读取 CLI 字符串和数字
【发布时间】:2020-11-24 17:48:01
【问题描述】:

我在尝试使用 Scanner 从命令行读取字符串时遇到了困难。 我的程序应该接受三本书的信息:书名和页数。 这些信息应该存储在一个文件中然后读取。目的是只显示超过 100 页的书籍。

玩了一段时间后,我设法得到了作品,但前提是我输入的书名不带空格。如果它键入带有空格的书名,我会出错。 我一直在尝试解决设置分隔符的问题,但运气不佳。

'''

/*
 *
 * FILE: booklist.java
 * 
 *
*/

import java.io.*;
import java.util.*;

class Libri {
   //Variabili membro
   private String titolo;
   private int pagine;
    
   //Costruttore
   Libri (String a, int b) {
    this.titolo = a;
    this.pagine = b;
   }

   //Metodi
   public String toString() {
    return this.titolo + " " + this.pagine;
   }

   String getTitolo() {
    return this.titolo;
   }

   int getPagine() {
    return this.pagine;
   }

} // Fine classe libri


class SortByPagine implements Comparator<Libri> {
   public int compare(Libri a, Libri b) {
    return Integer.compare(a.getPagine(), b.getPagine());
   }
    
} // Fine classe SortByPagine

class booklist {
 public static void main(String args[]) {
   // Definizione variabili
    String titoloLibro = "";
    int numeroPagine = 0;
    boolean append = false;
    File fileX = new File("C:\\Users\\loremac13\\Documents\\Esercizi\\Lez14\\Testout.txt");

    try (FileReader fr = new FileReader(fileX); FileWriter fw = new FileWriter(fileX, append)) {
        // Definizione Scanner per lettura dati libri ed ArrayList
        Scanner scn = new Scanner(System.in);
        //scn.useDelimiter("\n");
        ArrayList<Libri> alB = new ArrayList<>();
        Libri catalogo;
    
        for (int a=0; a<3; a++) {
            // Richiesta dati ad utente
            System.out.println("PLEASE PROVIDE THE BOOK TITLE AND PRESS ENTER");            
            titoloLibro = scn.next();
            fw.write(titoloLibro + "\n");
            System.out.println(titoloLibro);
            System.out.println("PLEASE PROVIDE NUMBER OF PAGES AND PRESS ENTER");       
            numeroPagine =  scn.nextInt();
            fw.write(numeroPagine + "\n");                  
            System.out.println(numeroPagine);
            catalogo = new Libri(titoloLibro, numeroPagine);
            alB.add(catalogo);
        } // Fine ciclo for
        scn.close();
        fw.close();

    System.out.println("THE BOOK CATALOGUE CONTAINS:" + alB + " TOTAL NUMBER OF BOOKS:" + alB.size());

    Scanner src = new Scanner(fr);
            
    // Imposto demilitatore personalizzato -ACCAPO-
    src.useDelimiter("\n");
        
    // Creo ArrayList per contenere i libro con più di 100 pagine.
    ArrayList<Libri> alBFiltrato = new ArrayList<>();
            
    System.out.println("\n IL FILE CONTIENETE:");

    while (src.hasNextLine()) {
        String name = src.next();
        int number = src.nextInt();
        src.nextLine();
        System.out.println(name + " and " + number);
            if (number >= 100) {
                Libri catalogoFiltrato = new Libri(name, number);
                alBFiltrato.add(catalogoFiltrato);
            } // fine if numeroPagine           

    } // Fine While loop
    src.close();
    System.out.println("BOOKS WITH AT LEAST 100 PAGES:" + alBFiltrato + "TOTAL NUMBER OF BOOKS:" + alBFiltrato.size());
            
    // Ordino lo array list in base al numero di pagine.
    Collections.sort(alBFiltrato, new SortByPagine());
    System.out.println("BBOKS WITH AT LEST 1OO PAGES - SORTED BY PAGES:" + alBFiltrato);
                
    } catch (FileNotFoundException e) {
    } catch (IOException e) {
    }
} // Fine main
} // Fine classe booklist
'''

【问题讨论】:

  • 代码中的哪一行出错了?
  • 我在线程“main”java.util.inputMismatchException 中遇到异常。我已经改变了 titoloLibro = scn.next();与 titoloLibro = scn.nextLine();这让我可以输入带空格的书名,但后来我在输入书页时遇到了问题,这是我能做到的。

标签: java java.util.scanner


【解决方案1】:

如果您需要阅读包含空格的书名,则可以使用方法 nextLine()。

titoloLibro = scn.nextLine();

API 文档: “将扫描仪前进到当前行并返回被跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。位置设置为下一行的开头。”

如果您遇到“进入书页时出现问题”,请在阅读页面后再添加一次 nextLine() 调用。读取整数页后,必须消耗剩余的行尾字符。

numeroPagine =  scn.nextInt();
scn.nextLine();

【讨论】:

  • 它有效!,我确实添加了 scn.nextLine();正如您在 numeroPagine = scn.nextInt(); 之后建议的那样它有效!你是怎么理解的?
  • 我之前也遇到过类似的问题。 nextInt() 等方法留下了行分隔符,所以需要显式阅读并扔掉。
猜你喜欢
  • 2010-11-30
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 2015-10-13
相关资源
最近更新 更多