不带空格、逗号或句点的输入计数-Java

  • 本文关键字:-Java 句点 空格 java loops
  • 更新时间 :
  • 英文 :


输入为"听着,琼斯先生,冷静下来">


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(!='.'(

也缺少&amp;(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();

由于只是一行代码,漏洞可以隐藏的矛更少了。

相关内容

  • 没有找到相关文章

最新更新