Java 第一个字母不';在单词之间使用大量空格时,不要改为大写
我想把每个单词的第一个字母大写。当我输入Java 第一个字母不';在单词之间使用大量空格时,不要改为大写,java,Java,我想把每个单词的第一个字母大写。当我输入test-test时,它会变为test-test,但如果我在test-test之间使用大量空格,它不会将首字母改为大写。我应该如何更改代码才能正常工作 public class Solution { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputSt
test-test
时,它会变为test-test
,但如果我在test-test
之间使用大量空格,它不会将首字母改为大写。我应该如何更改代码才能正常工作
public class Solution
{
public static void main(String[] args) throws IOException
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try{
String test = reader.readLine();
String[] testSplit = test.split( " " );
StringBuilder sb = new StringBuilder();
for (int I =0 ; I < testSplit.length ; I ++){
String capitalVer = capitalizeFirstLetter(testSplit[I]);
if( I != 0 ){
sb.append(" ");
}
sb.append(capitalVer);
}
System.out.println(sb.toString());
}
catch(Exception es)
{
}
}
public static String capitalizeFirstLetter(final String string)
{
if (string == null || string.equals("") )
throw new NullPointerException("no string ");
return Character.toUpperCase(string.charAt(0)) + string.substring(1);
}
}
公共类解决方案
{
公共静态void main(字符串[]args)引发IOException
{
BufferedReader reader=新的BufferedReader(新的InputStreamReader(System.in));
试一试{
字符串测试=reader.readLine();
字符串[]testSplit=test.split(“”);
StringBuilder sb=新的StringBuilder();
for(int I=0;I
更换
String[] testSplit = test.split( "" );
与:
通过这种方式,可以使用任意数量的空格进行拆分。但是,它不会保留每个单词之间的空格数量。
String[]testSplit=test.split(“”)代码>应该是String[]testSplit=test.split(“”)代码>
并且您可能需要修剪结果,因此capitalizeFirstLetter(testSplit[i].trim())
删除左侧和右侧的空白
除非您希望保留空白,否则您将需要一种不同的方法
编辑:
如果希望保留空白,请在capitalizeFirstLetter
方法中,检查每个字符是否为字母。如果不是字母,则将其附加到输出字符串(更好的StringBuilder)。如果它是一个字母,大写,加上它,再加上其余的,然后返回
编辑:
您的第一封信可能如下所示:
public static String capitalizeFirstLetter (String s) {
StringBuilder sb = new StringBuilder(); // use a StringBuilder to construct the output
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i); // get current character
if (Character.isLetter(c)) { // if character is a letter
sb.append(Character.toUpperCase(c)); // capitalize it
sb.append(s.substring(i+1)); // append the rest of the string
return sb.toString(); // return result
} else {
sb.append(c); // if character is not a letter, append character
}
}
return sb.toString(); // return result
}
公共静态字符串大写第一个字母(字符串s){
StringBuilder sb=new StringBuilder();//使用StringBuilder构造输出
对于(int i=0;i
两件事。首先,您的意思是在空格上拆分:
test.split( " " )
其次,当您点击空字符串时,capitalizeFirstLetter()
会引发异常。但是,由于您正在捕获并忽略异常,因此您永远看不到它
使用空字符串的原因是使用单个空格作为分隔符,例如,拆分“”
,将导致5个空字符串(在空格之间)。您可以修改capitalizeFirstLetter()
来处理空字符串,也可以拆分,比如说,\s+
来折叠空格——但是请注意,后者将折叠输出中的连续空格
添加System.out.println(Arrays.toString(testSplit))
是准确查看数组包含内容的好方法
这里的寓意是:正确处理异常;不要只是吞下它们并忽略它们。通过捕获异常,甚至在异常发生时不打印有关它们的信息,可以有效地禁用任何可能让您跟踪此问题的信息
顺便说一句,NullPointerException
实际上并不适用于空字符串;IllegalArgumentException
可能更具描述性。简短而简单,完成整个工作:
public static String capAllFirstLetters (String s) {
String capped = "";
char prev = ' ';
for (char c : s.toCharArray()) {
capped += "" + (Character.isWhitespace(prev) ? Character.toUpperCase(c) : c);
prev = c;
}
return capped;
}
或者,如果您更喜欢StringBuilder:
public static String capAllFirstLetters (String s) {
StringBuilder capped = new StringBuilder();
char prev = ' ';
for (char c : s.toCharArray()) {
capped.append(Character.isWhitespace(prev) ? Character.toUpperCase(c) : c);
prev = c;
}
return capped.toString();
}
这会将单词放在一起,但我希望保持单词之间的分隔。因此,最好不要使用正则表达式分隔字符串,因为这样不会保留此类信息。最好将字符串
放入字符串缓冲区
,循环检查它并检查字母是否是单词的第一个字母,然后将其大写。像这样拆分字符串并不能解决多个空格不大写的问题。@Predict\u看看编辑过的答案,我已将代码包含在我之前描述的内容中,以防您不清楚您的代码(如图所示)不会产生您描述的(不希望的)输出。对不起,我不明白。@Predict\u您不明白哪部分?您有一个try…catch
块来捕获异常。不过,您可以忽略例外情况。您的代码正在抛出一个异常,但因为您忽略了它,所以您永远看不到它。这意味着您的代码试图告诉您出了什么问题,但您看不到错误,因此您感到困惑。java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0@Predict_it此问题的答案详细描述了您的问题,并提供了解决问题所需的所有信息。除了为你工作之外,我能提供的东西不多了,我不会这么做的。
public static String capAllFirstLetters (String s) {
StringBuilder capped = new StringBuilder();
char prev = ' ';
for (char c : s.toCharArray()) {
capped.append(Character.isWhitespace(prev) ? Character.toUpperCase(c) : c);
prev = c;
}
return capped.toString();
}