首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法正确计算字符

无法正确计算字符
EN

Stack Overflow用户
提问于 2021-07-04 08:02:29
回答 3查看 1.1K关注 0票数 2

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

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

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

然而,问题是,如果需要的话,我必须能够输出输入字符的复数形式。我不知道我在这里做错了什么,但有时它会使一些不应该是复数的东西…基本上,如果这个单词中有0n,它应该显示0n...但它显示的是0n。

如果我的描述很糟糕,很抱歉。

代码语言:javascript
运行
复制
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");
      }
   }
}
EN

Stack Overflow用户

发布于 2021-07-04 14:41:51

不可重现

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

您的if级联有故障。wordCount的第一个if测试不到两个。

代码语言:javascript
运行
复制
if (wordCount < 2) {         // <--- Condition met for count of 0 or 1. 

0小于2。因此,第一个测试成功,其代码运行。

第二个小于零的if测试是多余的。第二个if

代码语言:javascript
运行
复制
else if (wordCount == 0) {   // <--- Never reaches this point for 0 or 1.

…对于wordCount为0或1,永远不会执行。对于wordCount为0(或1),第一个测试if (wordCount < 2) {将为真,因此它的System.out.println将运行,并且if级联结束。因此,我们永远没有机会测试计数是否为零。

对于您的规则“如果该单词中有0n,它应该显示0n”,请将您的代码更改为:

代码语言:javascript
运行
复制
  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。请参阅此答案中更下面的代码示例。

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

避免char

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

Unicode码位

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

您可以将字符串转换为IntStream以获得一系列int值,每个值都是该字符串中一个字符的代码点。

调用boxed将每个流式传输的int原语转换为Integer对象。

代码语言:javascript
运行
复制
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,不要使用任何撇号。为计数为0或多于1的计数附加s,但为计数为1的结果省略s

代码语言:javascript
运行
复制
String output = String.valueOf( frequency ) + " ‘" + Character.toString( codePoint ) + "’" ;
if ( frequency!= 1 ) {
    output = output + "s" ; 
}

请参阅此code run live at IdeOne.com

2‘a’s

代码语言:javascript
运行
复制
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 ) ;
    }
}
票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68240751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档