我应该有两个输入:一个是字符,另一个是字符串。
我必须编写一个程序来输出字符在字符串中出现的次数。
最后,我已经能够让程序显示字符输入在字符串中出现的适当次数。
然而,问题是,如果需要的话,我必须能够输出输入字符的复数形式。我不知道我在这里做错了什么,但有时它会使一些不应该是复数的东西…基本上,如果这个单词中有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 ) ;
}
}发布于 2021-07-04 15:12:19
首先避免任何分支的替代方法之一是始终在末尾附加"(s)“:
System.out.println(wordCount + " " + userLetter + "(s)");正如斯蒂芬·C提到的,撇号"‘",虽然有时用在你的意义上,但通常会表示一个possession,比如n的 length,甚至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()返回一个带有空格的字符串。可以通过将userLetter和userWord的值打印到控制台来验证这一点。
将前一行更改为:
userLetter = scnr.nextLine().charAt(0);这将使用尾随换行符的输入,而不会留下任何痕迹。
发布于 2021-07-04 16:33:19
我尝试了一些建议的解决方案,但它们对我不起作用,我设法找到了另一个可能符合您意图的解决方案:
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();
}https://stackoverflow.com/questions/68240751
复制相似问题