微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法正确计算字符

如何解决无法正确计算字符

我应该有两个输入:一个是字符,另一个是字符串。

我必须编写一个程序来输出字符在字符串中出现的次数

最后,我已经能够让程序显示字符输入在字符串中出现的适当次数

但是问题是我必须能够在必要时输出输入字符的复数形式。我不知道我在这里做错了什么,但有时它会在不应该出现的情况下变成复数......

对不起,如果我的描述很糟糕。

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");
      }
   }
}

解决方法

不可复制

作为 commented by Charlie Armstrong,您的问题不可重现。您应该提供一个 MCVE

您的 if 级联有问题。第一个 if 测试 wordCount 是否小于 2。

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);
  }

作为commented by Stephen C,您应该使用复数形式的零和多于一。因此,您的逻辑可以减少检查计数是否为 1,在这种情况下,您可以附加复数 s。请参阅此答案中的代码示例。

顺便说一下,我们可以通过 Collections.frequency 让 Java 完成繁重的工作来替换您的大部分代码。继续阅读。

避免char

char 类型已过时,甚至无法表示 Unicode 中定义的一半字符。

Unicode 代码点

相反,学习在处理单个字符时使用 Unicode code point 整数。

您可以将字符串转换为 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

如果结果不是 1,则附加 s

报告结果。

正如 Stephen C 评论的那样,在正确的英语中,您的目标字母应该用引号括起来,最好是 curly-quotes,不要使用任何撇号。附加 s 表示计数为零或大于一,但省略 s 表示结果为 1。

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

看到这个code run live at 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 ) ;
    }
}
,

首先避免任何分支的替代方法之一是始终在末尾附加“(s)”。:

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

正如 Stephen C 所提到的,撇号“”虽然有时按照您的意思使用,但通常表示 possession,如 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);

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

,

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

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();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。