【问题标题】:Words and lines counter from user input for Java来自 Java 用户输入的字数和行数计数器
【发布时间】:2020-02-26 05:48:30
【问题描述】:

我已经完成了这段代码,它正确打印了总行数,但对于总字数,它总是打印总共 1 个字。谁能帮帮我,谢谢!

import java.util.*;

public class LineAndWordCounter{
  public static void main(String[]args){



    Scanner scan = new Scanner(System.in);
    while(scan.hasNext()){
      String line = scan.next();

      linesCounter(scan);
      wordsCounter(new Scanner(line) );


    }


  }

  public static void linesCounter(Scanner linesInput){
    int lines = 0;
    while(linesInput.hasNextLine()){
      lines++;
      linesInput.nextLine();
    }
    System.out.println("lines: "+lines);
  }

  public static void wordsCounter(Scanner wordInput){
    int words = 0;
    while(wordInput.hasNext()){
      words++;
      wordInput.next();
    }
    System.out.println("Words: "+words);
  }




}

【问题讨论】:

  • 你是不是应该输入几行,当它完成后,计算输入的行数和单词数?
  • @NomadMaker 我尝试对行和单词使用相同的扫描仪,代码将完美地计算行数,但是当需要计算单词时,指针将位于输入的末尾,所以有将零字:(
  • 您的函数采用与 Scanner 相同类型的参数,但您为 linesCounter 发送扫描,为 wordsCounter 发送新的 Scanner(line)。为什么?我认为您应该将相同的扫描对象传递给您的 wordsCounter 函数,并且您应该根据空格拆分收到的参数。然后您可以计算此特定行中的每个单词。目前您只收到一行,并且只使用 hasext() 对其进行一次迭代。
  • @ArdahanKisbet 我尝试对行和单词使用相同的扫描仪,代码将完美地计算行数,但是当需要计算单词时,指针将位于输入的末尾,所以有将零字。
  • 当你计算行数时,你会阅读整行。您可以使用此字符串(行)并使用 String[] words = line.split()。这将为您提供一个数组,数组的长度( words.length )是该行中的单词数。

标签: java line counter word


【解决方案1】:

这对我来说看起来相当复杂。

您可以将每一行保存在 ArrayList 中,并将单词累积在一个变量中。 像这样的:

List<String> arrayList = new ArrayList<>();
int words = 0;

Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
  String line = scan.nextLine();
  arrayList.add(line);
  words += line.split(" ").length;
  System.out.println("lines: " + arrayList.size());
  System.out.println("words: " + words);
}

scan.close();

您也不应忘记调用close()Scanner 方法以避免资源泄漏

【讨论】:

  • 在不再使用扫描仪之前不要关闭它。关闭扫描仪也将关闭提供它的流。如果它是一个文件,那没关系,因为您可以重新打开一个文件。如果是System.in,重新打开也不容易。
  • scan.hasNext() 返回false 那么扫描仪就没有用处了,不是吗?
  • @Peter Lustig 非常感谢!它确实有效,只需要稍作改动: System.out.println("lines: " + arrayList.size()); System.out.println("字数:" + 字数);必须退出while循环以避免每次循环时打印。
  • 您也可以使用来自 org.apache.commons.lang 的 line.split("\\s")line.split(StringUtils.SPACE)
  • 我不建议为此添加额外的依赖项。
【解决方案2】:
scan.next()

返回下一个“单词”。

如果你用那个一个词创建一个新的Scanner,它只会看到一个词

这将发生在

String line = scan.next();
wordsCounter(new Scanner(line) );

【讨论】:

  • 我找不到通过扫描仪获取所有单词的方法 :( 因为如果我使用同一个扫描仪进行单词和行数计数,其中一个就可以了/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多