问题描述
最后,我已经能够让程序显示字符输入在字符串中出现的适当次数。
但是问题是我必须能够在必要时输出输入字符的复数形式。我不知道我在这里做错了什么,但有时它会在不应该出现的情况下变成复数......
对不起,如果我的描述很糟糕。
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()
返回一个带空格的字符串。您可以通过将 userLetter
和 userWord
的值打印到控制台来验证这一点。
将前一行改为:
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();
}