我应该有两个输入:一个是字符,另一个是字符串。
我必须编写一个程序来输出字符在字符串中出现的次数。
最后,我已经能够让程序显示字符输入在字符串中出现的适当次数。
然而,问题是,如果需要的话,我必须能够输出输入字符的复数形式。我不知道我在这里做错了什么,但有时它会使一些不应该是复数的东西…基本上,如果这个单词中有0n,它应该显示0n...但它显示的是0n。
如果我的描述很糟糕,很抱歉。
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");
}
}
}发布于 2021-07-04 14:41:51
不可重现
作为commented by Charlie Armstrong,您的问题是不可重现的。您应该提供一个MCVE。
您的if级联有故障。wordCount的第一个if测试不到两个。
if (wordCount < 2) { // <--- Condition met for count of 0 or 1. 0小于2。因此,第一个测试成功,其代码运行。
第二个小于零的if测试是多余的。第二个if
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”,请将您的代码更改为:
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对象。
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。
String output = String.valueOf( frequency ) + " ‘" + Character.toString( codePoint ) + "’" ;
if ( frequency!= 1 ) {
output = output + "s" ;
}请参阅此code run live at IdeOne.com。
2‘a’s
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 ) ;
}
}https://stackoverflow.com/questions/68240751
复制相似问题