2013-10-24 67 views
0

我正在尝试编写一段代码,以在句点“”之后大写第一个字母。“大写首字母

例如:

String str = "abcdef. ghijk, mlnopqrs. tuv .................." 
//the "............" means the line is still going on. 

输出应该是:

"Abcdef. Ghijk, mlnopqrs. Tuv ................."

注:只使用基本的方法

字符串:charAtindexOflengthsubstringtoUpperCase

这意味着没有Stringbuilder,没有阵列,没有分裂......等我在这个网站上找到的其他解决方案涉及这些事情。


编辑:非常感谢大家的快速回复。刚刚看到了Robin Krahl的编辑。是的,我忘了添加我的代码。我的代码看起来很像mau的回复。但是这个代码结束了与此异常

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围

,从这里我不知道如何解决-.-

+0

提示:为了避免'StringBuilder',你可以连接字符串与'+ ='运营商。为了避免数组和'split'方法,使用循环。 - 我们不是在这里做你的功课,所以请表明你至少试图解决问题。然后我们可以帮助你。 –

+0

我编辑了我的答案,其中包含完美解决您的问题的代码。让我知道如果它不工作:) – necromancer

回答

0

一个新的String构建一个状态机2点的状态,并把它扫描的字符。

开始在状态1:切换到状态2,如果输入是周期

状态2:切换到状态1,如果输入不是周期,而不是空间

状态1:输出没有修改

输入

状态2:如果输入是一个字符,输出大写使用toUpper

import java.util.Scanner; 
public class Capitalize { 
    public static void main (String [] args) { 
    Capitalize instance = new Capitalize(); 
    try (Scanner s = new Scanner(System.in)) { 
     while (s.hasNext()) { 
     instance.capitalize_and_print(s.nextLine()); 
     } 
    } 
    } 

    public void capitalize_and_print (String s) { 
    int state = 0; 
    for (int i = 0; i < s.length(); ++i) { 
     switch (state) { 
     case 0: 
      System.out.print(s.charAt(i)); 
      if (s.charAt(i) == '.') { 
      state = 1; 
      } 
      break; 
     case 1: 
      System.out.print(Character.toUpperCase(s.charAt(i))); 
      if (s.charAt(i) != '.' && s.charAt(i) != ' ') { 
      state = 0; 
      } 
      break; 
     } 
    } 
    } 
} 

更新:简单的版本

public class Capitalize { 
    public static void main (String [] args) throws java.io.IOException { 
    int state = 2; 
    int c = System.in.read(); 
    while (c != -1) { 
     if (state == 1) { 
     System.out.print((char)c); 
     if (c == '.') { 
      state = 2; 
     } 
     } else { 
     System.out.print(Character.toUpperCase((char)c)); 
     if (c != '.' && c != ' ') { 
      state = 1; 
     } 
     } 
     c = System.in.read(); 
    } 
    } 
} 

更新2:甚至简单的版本

public class Capitalize { 
    public static void main (String [] args) throws java.io.IOException { 
    String str = "abcdef. ghijk, mlnopqrs. tuv .................."; 
    int state = 2; 
    for (int i = 0; i < str.length(); ++i) { 
     char c = str.charAt(i); 
     if (state == 1) { 
     System.out.print(c); 
     if (c == '.') { 
      state = 2; 
     } 
     } else { 
     System.out.print(Character.toUpperCase(c)); 
     if (c != '.' && c != ' ') { 
      state = 1; 
     } 
     } 
    } 
    } 
} 
+0

我只能使用基本的方法:( – LightAngels

+0

哪种方法在我的解决方案中不是基本的? – necromancer

+0

大写实例= new Capitalize(); <<这个,还有“case”,“switch”,“try”我只能用“for”,“while”,“if”:( – LightAngels

1

我可以帮助你的逻辑部分:

  1. 查找子字符串直到“。”
  2. 使charAt子字符串的第零位置为大写。
  3. 循环1到2直到不再有“。”存在字符串中
  4. 串联的子

希望这有助于

+0

“这意味着没有Stringbuilder,没有阵列,**没有分裂**” – Craig

+0

不允许分裂。 – Rawa

+0

更新了算法。 – Reji

1
int length = str.length() 
for(int x = 0; x < length-1; x++) { 
    if(str.charAt(x) == '.') { 
    str = str.substring(0,x+1) + (""+str.charAt(x+1)).toUpperCase() + str.substring(x+2,length+1); 
    } 
} 

如果期限届满后,信是不是直接的,要不是看就有好感,或循环来寻找下一个信。你可以说

letter = str.charAt(x); 
if((letter >= 'A' && letter <= 'Z") || (letter >= 'a') && letter <= 'z')) 
+0

非常接近,但你需要存储最后一个字符被发现的索引。当你沿着数组走时,你会更新最后一个字符,如果它不是空格。如果你找到一个站点,你可以在存储的索引处大写字符。 –

1

我会做的方式:

  • 获得字符数组,String.toCharArray()
  • 使用计数器依次查看数组中的每个字符。
  • 当您找到句点时,请设置一个标志。
  • 如果在设置标志时发现字母,请清除该标志并用其大写版本替换该字符。
  • 一旦你完成通过循环下去,创建String.valueOf()
+1

“表示没有Stringbuilder,**没有数组**,没有分割” – Craig

+0

没有注意到数组位。您可以将每个字符逐个追加到单独的结果字符串中,而不是一个数组,但显然效率不高。 – Meindratheal