无法正确计数字符

7z5jn7bk  于 2021-08-20  发布在  Java
关注(0)|答案(3)|浏览(276)

我应该有两个输入:一个是字符,另一个是字符串。
我必须编写一个程序,输出字符在字符串中出现的次数。
最后,我能够让程序显示字符输入在字符串中出现的适当次数。
但是问题是,如果需要,我必须能够输出输入字符的复数形式。我不知道我在这里做错了什么,但有时它会使一些不应该是复数的东西。。。基本上,如果单词中有0N,它应该显示0N。。。但它显示的是0 n。
对不起,如果我的描述很糟糕。

import java.util.Scanner;

public class LabProgram {
    public static void main(String[] args) {
      Scanner scnr = new Scanner (System.in);
      char userLetter;
      String userWord;

      userLetter = scnr.next().charAt(0);
      userWord = scnr.nextLine();

      int wordCount = 0;

      for (int i = 0; i < userWord.length(); i=i+1) {
         if (userWord.charAt(i) == userLetter){
            wordCount = wordCount + 1;
         }}

      if (wordCount < 2) {
         System.out.println(wordCount + " " + userLetter);
      }
      else if (wordCount == 0) {
         System.out.println(wordCount + " " + userLetter);
      }
      else {
         System.out.println(wordCount + " " + userLetter + "'s");
      }
   }
}
new9mtju

new9mtju1#

避免任何分支的备选方案之一是始终附加“ (s) “最后:

System.out.println(wordCount + " " + userLetter + "(s)");

正如stephen c提到的,撇号“ ,虽然有时用在你所拥有的意义上,但通常表示拥有,如n的长度,甚至n的频率。这给我带来了更多的选择:

System.out.println(userLetter + "'s frequency" + ": " + wordCount);

System.out.println("The number of times the letter " + userLetter + " appears is " + wordCount);

除了多元化问题之外,值得注意的是,在执行这一行之后:

userLetter = scnr.next().charAt(0)

在输入源中留下一个尾随的新行。这是一个微妙但最常见的编程错误之一。执行下一行时:

userWord = scnr.nextLine();

它读入尾随的新行并忽略您的第二个输入和 nextLine() 返回带空格的字符串。您可以通过打印 userLetteruserWord 到控制台。
将前一行更改为:

userLetter = scnr.nextLine().charAt(0);

这将使用带有尾随换行符的输入,而不会留下任何痕迹。

9gm1akwq

9gm1akwq2#

不可生产

正如查理·阿姆斯特朗(charlie armstrong)所评论的,你的问题是不可复制的。你应该提供一个mcve。
你的 if 级联有故障。第一 if 测试 wordCount 少于两个。

if (wordCount < 2) {         // <--- Condition met for count of 0 or 1.

零小于二。因此,第一个测试成功,其代码运行。
你的第二个 if 小于零的测试是冗余的。那一秒 if :

else if (wordCount == 0) {   // <--- Never reaches this point for 0 or 1.

…永远不会执行一次命令 wordCount 0或1的。第一次测试 if (wordCount < 2) { 一段时间内都是这样 wordCount 零(或一),因此 System.out.println 将运行,并且 if 瀑布结束。所以我们从来没有机会测试计数是否为零。
对于“如果该单词中有0个n,则应显示0个n”的规则,请将代码更改为:

if ( wordCount > 1 ) {  // For a count of 2 or more.
     System.out.println(wordCount + " " + userLetter + "'s");
  }
  else {  // Else use singular for count of 0 or 1. (Ignoring negative numbers.) 
     System.out.println(wordCount + " " + userLetter);
  }

正如stephen c所评论的,您应该将复数与零和多个一连用。因此,如果计数不是一,则可以减少逻辑,在这种情况下,可以附加复数 s . 请参阅下面这个答案中的代码示例。
顺便说一下,我们可以通过让java通过 Collections.frequency . 继续读下去。

避免煤焦

这个 char 类型已过时,无法表示unicode中定义的一半字符。

unicode码点

相反,学习在处理单个字符时使用unicode代码点整数。
你可以把一根绳子变成一根绳子 IntStream 获得一系列 int 值,每个值都是该字符串中字符的代码点。
呼叫 boxed 要转换每个流媒体 int 原始的 Integer 对象

List< Integer > codePoints = "Java".codePoints().boxed().toList() ;  // Prior to Java 16, use `.collect( Collectors.toList() )` in place of `.toList()`.
Integer codePoint = "a".codePoints().toArray()[0] ;
int frequency = Collections.frequency( codePoints , codePoint ) ;

频率=2

如果结果不是一,则追加s

报告结果。
正如stephen c所评论的,在正确的英语中,你的目标字母应该用引号括起来,最好是 curl 的引号,不使用任何撇号。附加 s 对于零或多个计数,但忽略 s 为了一个结果。

String output = String.valueOf( frequency ) + " ‘" + Character.toString( codePoint ) + "’" ;
if ( frequency!= 1 ) {
    output = output + "s" ; 
}

请在ideone.com上查看此代码的实时运行。
2'a

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

import java.util.stream.* ;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        List< Integer > codePoints = "Java".codePoints().boxed().collect( Collectors.toList() ) ;
        Integer codePoint = "a".codePoints().toArray()[0] ;
        int frequency = Collections.frequency( codePoints , codePoint ) ;

        String output = String.valueOf( frequency ) + " ‘" + Character.toString( codePoint ) + "’" ;
        if ( frequency!= 1 ) {
            output = output + "s" ; 
        }

        System.out.println( output ) ;
    }
}
sqyvllje

sqyvllje3#

我试图遵循一些建议的解决方案,但它们对我无效,我设法找到了另一个可能符合您意图的解决方案:

public static void main(String[] args) {

    Scanner scnr = new Scanner(System.in);

    System.out.print("Enter the word: ");
    String userWord = scnr.nextLine();

    System.out.print("Enter the letter: ");
    String userLetter = scnr.nextLine();

    List<Character> chars = userWord.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
    Character targetChar = userLetter.charAt(0);

    final int frequency = Collections.frequency(chars, targetChar);

    if (frequency < 2) {
        System.out.println(frequency + " " + userLetter);
     }
     else if (frequency == 0) {
        System.out.println(frequency + " " + userLetter);
     }
     else {
        System.out.println(frequency + " " + userLetter + "'s");
     }

    scnr.close();
}

相关问题