Java---Stringuffer类及一个实例

原题目:

编写一个Java程序,将用户输入的句子当中每一个单词的第一个字母大写,而单词中的其余字母小写。

要求:程序运行后要求用户输入一个句子。然后提取每一个单词,并将单词的首字母转换成大写,其余字符小写。使用StringBuffer类来创建替换过大小写的新字符串。最后输出新字符串。

提示:需要使用Scanner的nextLine()方法来获取一个句子。注意:单词的分割符除了空格之外,还可能有Tab或者(,;.等标点符号)。注意判断首字符是不是字母。单词中的其他字母可能为大写。

例如:当用户输入”This is a samPLe sentencE to demostrATE the TasK 2.”

程序应该输出:This Is A Sample Sentence To Demonstrate The Task 2.

(最后有源代码

StringBuffer类

与String的区别:String类的方法不可修改原字符串,只能创建新的字符串;
本题采用StringBuffer的数据类型;

1. 初始化:
StringBuffer sb = new StringBuffer();
2. 输出:

System.out.printfln()可以直接输出StringBuffer类;

3. 大小写转换方法:
  • 方法一:.append(Character.toUpperCase(char))

    • 先创建一个空的StringBuffer类型,再用append去添加;
    • append后面可以接char类型,可以用以包装的character.toUpperCase()(或者character.toLowerCase())的大小写转换方法,转换大小写(相当于用方法自动转),返回值为char类型;例如:sb.append(Character.toUpperCase(str.charAt(i)));
    • 也可以用(char)进行类型转换;
      (本题所给代码采用方法一)
  • 方法二:算术法,将大小写转为用ascii值转换;即str.charAt(i)-=32;,其转化后的值为int类型的值(原因如下:)

    • 这里涉及强制类型转换
      • 强制类型转换只发生在int char float double之间;

      • 下面举一个例子:

        char a='a';
        char b=a+18;
        char c='a'+18;
      1. 此处的b和c就不是一回事了,就像’a’和a是不一样的;'a’和97一样,是int类型的常量,而a是变量,仅仅是把常量的值赋值给了变量;
      2. 把’a’这个int值传给了char类型的a,此时的b就相当于一个char类型的值和一个int类型的值(18)做运算,其结果当然为int类型,此时会经历强制类型转换;
      3. 而c相当于两个int类型的值做运算,然后生成一个新的int类型的常量。常量的值赋给变量,不存在强制类型转换,只需要这个变量的类型可以容纳这个新的常量即可。
        此处附上:详细解释地址
    • 大小写转换后再将int型转化为其他类型(char/String);
      例如用(char)强转:sb.append((char)(str.charAt(i)-32));
    • 注意要用字符型/字符串型与ascii码的转换;

另外:

  • 方法三:.replace(int,int,String)
  • 而replace后面必须接string类型
  • 而此时用Character的方法显然只能生成char类型的数据,而并不能生成String类型;
问题解决源代码
package hw_2;

import java.util.Scanner;

public class mask_2 {
 public static void main(String[] args) {
  Scanner in=new Scanner(System.in);
  String str=new String(in.nextLine());
  string s=new string();
  System.out.println(s.buffer(str));
 }
}

class string{
 StringBuffer sb=new StringBuffer();  //用sb保存新字符串
 StringBuffer buffer(String str) {  //先创建保存原来的输入字符串;
  int i;
  for(i=0;i<str.length();i++) {
   if(i==0 && str.charAt(i)>='a' && str.charAt(i)<='z') {
    sb.append((char)(str.charAt(i)-32));
   }
   else {
    if(str.charAt(i)>='a' && str.charAt(i)<='z') {
     if(str.charAt(i-1)==' ' || str.charAt(i-1)=='.' || str.charAt(i-1)==';' || str.charAt(i-1)==',' ) {
      sb.append(Character.toUpperCase(str.charAt(i)));
     }
     else {
      sb.append(str.charAt(i));
     }
    }
    else if(str.charAt(i)>='A' && str.charAt(i)<='Z') {
     if(i==0 || str.charAt(i-1)==' ' || str.charAt(i-1)=='.' || str.charAt(i-1)==';' || str.charAt(i-1)==',' ) {
      sb.append(str.charAt(i));
     }
     else {
      sb.append(Character.toLowerCase(str.charAt(i)));
     }
    }
    else {
     sb.append(str.charAt(i));
    }
   }
  }
  return sb;
 }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值