Java基础课 | 句子缩写
Java基础
字符串
访问字符串中的字符
charAt(index)
方法,可访问字符串中每一个字符。
去除字符串两端的空格
trim()
方法,用于去除字符串两端(首尾两端)的空格。
将字符串转为字符数组
toCharArray()
,用法:
//line为字符串变量
char[] arr = line.toCharArray();
编码标准
ASCII 码
比较早、简单的字符编码标准。仅包含128个不同的字符,主要是一些基本的拉丁字母、数字、标点符号、回车、换行等,每个字符都有一个唯一的整数数值与之对应。
Unicode 码
更广泛的字符编码标准。包含世界上几乎所有已知的字符、符号和文字。常见的 Unicode 编码包括 UTF-8、UTF-16、UTF-32,他们使用不同数量的字节来表示字符。
字符
字符编码
每个字符有一个唯一的ASCII编码值,表示它在ASCII字符集中的位置。
字符大小的比较
在比较字符大小时,实际上是比较其ASCII编码值。大小写字母之间的差值是32。
大小写字母转换
推荐做法:使用内置方法进行字符转换,常用以下两个
Character.toUpperCase()
:小写字母→大写Character.toLowerCase()
:大写字母→小写
其他做法:大写字母的ASCII码值 + 32 = 对应的小写字母的ASCII码值。
StringBuilder
用于处理字符串。
为什么使用StringBuilder
而不是String
?
- 使用
String
进行字符串拼接时,每次拼接都会创建一个新的字符串对象,将产生大量的临时对象,会影响性能。 StringBuilder
是可变的,允许我们在不创建新字符串对象的情况下进行字符串的连接和修改,不会创建大量的临时对象,因此更高效。
常见用法:
- 添加字符:
append()
方法 - 输出:可用
toString()
方法转为字符串后输出
StringBuilder sb = new StringBuilder();
sb.append('A');
System.out.println(sb.toString());
题目
题目描述
输出一个词组中每个单词的首字母的大写组合。
输入描述
输入的第一行是一个整数n,表示一共有n组测试数据。(输入只有一个n,没有多组n的输入)
接下来有n行,每组测试数据占一行,每行有一个词组,每个词组由一个或多个单词组成;每组的单词个数不超过10个,每个单词有一个或多个大写或小写字母组成;
单词长度不超过10,由一个或多个空格分隔这些单词。
输出描述
请为每组测试数据输出规定的缩写,每组输出占一行。
程序编写
参考写法:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
int n = sc.nextInt();
sc.nextLine();
for (int i = 0; i < n; i++) {
String line = sc.nextLine().trim(); // 获取每行输入的字符串
char[] arr = line.toCharArray(); // 将字符串转为字符数组,方便遍历
StringBuilder sb = new StringBuilder(); // 新建一个stringbuffer对象,输出最终结果
int j = 0;
while (j < arr.length) { // 遍历字符数组
if (arr[j] <= 'z' && arr[j] >= 'a') {
arr[j] = Character.toUpperCase(arr[j]);
}
sb.append(arr[j]); // 将转为大写的字符拼接到 stringbuffer中
while (j < arr.length && arr[j] != ' ') { // 跳过当前单词首字母之后的字母
j++;
}
while (j < arr.length && arr[j] == ' ') { // 跳过空格
j++;
}
}
System.out.println(sb.toString());
}
}
}
}
我的写法:
import java.util.Scanner;
public class Main {
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt()){
int n = sc.nextInt();
sc.nextLine();
while(n-- >0){
String line = sc.nextLine();
char[] arr = line.toCharArray();
StringBuilder sb = new StringBuilder();
boolean first = true;
// 遍历字符数组
for(char c:arr){
if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')){
if(first) {
sb.append(Character.toUpperCase(c));
first = false;
}
}
if(c == ' ') first=true;
}
System.out.println(sb.toString());
}
}
}
}
其中,遍历字符数组的部分也可以写成:
// 遍历字符数组
for(char c:arr){
if(first){
if(c == ' ') continue;
if(c >= 'a' && c <= 'z') c = Character.toUpperCase(c);
sb.append(c);
first = false;
}
if(c == ' ') first=true;
}