输入为"听着,琼斯先生,冷静下来">
import java.util.Scanner;
public class LabProgram {
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
String userText;
int numPun = 0; //number of punctiation and spaces
// Add more variables as needed
userText = scnr.nextLine(); // Gets entire line, including spaces.
for (int i = 0; i < userText.length(); i++){
if ((userText.charAt(i) != ' ') && (userText.charAt(i) != ',') && (userText.charAt(i) != '.'));{
numPun++;
}
}
System.out.println(numPun);
}
}
我当前的输出是29,这是整行中的字符总数。预期输出应为21。我哪里错了?
使用分号终止if
,并使用&&
而非||
在这个答案的早期版本中,我指定使用||
而不是&&
。不要那样做。巴兹尔·伯克是第一个指出这一点的人
用途:
for (int i = 0; i < userText.length(); i++){
char current = userText.charAt(i);
if (current != ' ' && current != ',' && current != '.'){
numPun++;
}
}
在if
语句表达式之后有一个额外的;
。
看到它在行动
解释:
在该答案的先前版本中,表达式current != ' ' || current != ',' || current != '.'
等于if current is not a space or is not a comma or is not a period do this:
。
这意味着,如果字符是逗号,它会在numPun
上加1,因为它不是空格。
在新的表达式中,它等于if current is not a space and is not a comma and is not a period
。因此,它将首先检查它是否是空格,然后是逗号,然后是句点。
用分号是,但||
不是
正如Answer by Spectric正确地指出的那样,您需要修复偏离的分号。
但是||
的使用说明不正确。
这是您的代码,已更正。
String input = "Listen, Mr. Jones, calm down.";
int countLetters = 0;
for ( int i = 0 ; i < input.length() ; i++ )
{
char c = input.charAt( i );
//System.out.println( "c = " + c );
if ( ( c != ' ' ) && ( c != ',' ) && ( c != '.' ) )
{
countLetters++;
}
}
System.out.println( "countLetters = " + countLetters );
请在IdeOne.com上实时查看此代码。
21
我会使用禁止字符的List
而不是一系列相等测试来编写这样的代码。
String input = "Listen, Mr. Jones, calm down.";
List < String > nonLetters = List.of( " " , "," , "." );
int countLetters = 0;
for ( int i = 0 ; i < input.length() ; i++ )
{
char c = input.charAt( i );
System.out.println( "c = " + c );
if ( ! nonLetters.contains( String.valueOf( c ) ) )
{
countLetters++;
}
}
System.out.println( "countLetters = " + countLetters );
更好的是:使用代码点,而不是char
类型。
代码点,而不是char
char
类型在Java中已过时。这种类型是一种遗迹,甚至不能代表Unicode中定义的一半字符。
相反,使用代码点号来表示每个字符。Unicode为其143859个字符中的每个字符分配一个整数。代码点的范围从零到超过一百万,其中大多数是未分配的。
String
类可以为每个字符返回代码点号的IntStream
。将该IntStream
转换为int
数字的数组。循环数组。对于每个代码点编号,询问Unicode分配给该编号的字符是否被视为字母。如果是一封信,请增加我们的计数。
String input = "Listen, Mr. Jones, calm down.";
int countLetters = 0;
int[] codePoints = input.codePoints().toArray();
for ( int codePoint : codePoints )
{
if ( Character.isLetter( codePoint ) )
{
countLetters++;
}
}
System.out.println( "countLetters = " + countLetters );
21
流
我们甚至可以使用Java流和lambda特性制作一个单行。
long countLetters =
"Listen, Mr. Jones, calm down."
.codePoints()
.filter(
( int codePoint ) -> Character.isLetter( codePoint )
)
.count()
;
21
(userText.charAt(i(!=''(||(userText.charAt(i(!=','(||(userText.charAt(i(!='.'(
也缺少&;(c!='!'((,它正在计算所有额外的感叹号并未通过测试。
完成代码如下:
import java.util.Scanner;
public class LabProgram {
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
String userText;
userText = scnr.nextLine();
String input = userText;
int countLetters = 0;
for ( int i = 0 ; i < input.length() ; i++ )
{
char c = input.charAt( i );
if ( ( c != ' ' ) && ( c != ',' ) && ( c != '.' ) && (c != '!' ) && (c !=
'!' ))
{
countLetters++;
}
}
System.out.println(countLetters );
}
}
这是我的代码,它满足了zyBooks中的所有问题。
在此处输入图像描述
这就是我所做的,保持简单。
int output;
userText = scnr.nextLine(); // Gets entire line, including spaces.
userText = userText.replace(" ", "");
userText = userText.replace(".", "");
userText = userText.replace("!", "");
userText = userText.replace(",", "");
output = userText.length();
System.out.println(output);
通常,最好的第一步是简化问题:如果重新表述,它可以变成"有多少个单词字符?",可以用代码表示为"删除所有非单词字符后的输入有多长:
int count = userText.replaceAll("\W", "").length();
由于只是一行代码,漏洞可以隐藏的矛更少了。