标题串的简单处理Java实现
题目如下:串的处理(Java实现)
在实际的开发工作中,对字符串的处理是最常见的编程任务。
本题目即是要求程序对用户输入的串进行处理。具体规则如下:
- 把每个单词的首字母变为大写。
- 把数字与字母之间用下划线字符(_)分开,使得更清晰
- 把单词中间有多个空格的调整为1个空格。
例如:
用户输入:
you and me what cpp2005program
则程序输出:
You And Me What Cpp_2005_program
用户输入:
this is a 99cat
则程序输出:
This Is A 99_cat
我们假设:用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号。
每个单词间由1个或多个空格分隔。
假设用户输入的串长度不超过200个字符。
思路
基本思路就是将一个串的每一个字符都拿出来进行分析判断
1、字母 :两种情况
①、这个字母是单词的首字母,需要大写;
②、这个字母不是单词的首字母,照搬;
2、数字:三种情况
①、这个数字前面是字母,先加一个‘_’,在把数字添加
②、这个数字后面是字母,和上面的情况反过来就行了
③、其他,直接添加
3、空格:两种情况
①、这个空格后面还是空格,直接跳到下一个字符;
②、这个空格后面是其他字符,直接添加;
特殊情况:
1、开头和结尾有一个或者多个空格,按道理应该删掉,但是题目并没有说明。
2、如果一个单词之中出现了大写,是否要变为小写。
代码(自己写的)
public class Solution {
public String simpleStringActiong(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
if(i + 1 < str.length() && str.charAt(i) == ' ' && str.charAt(i+1) != ' ' ) { //对连续的多个空格的处理
sb.append(' ');
}
if(str.charAt(i) >= '0' && str.charAt(i) <= '0'+9) { //如果他是个数字
if(i>0 && isLetter(str.charAt(i - 1))) {
sb.append('_');
sb.append(str.charAt(i));
continue;
}
if(i < str.length() - 1 && isLetter(str.charAt(i + 1))) {
sb.append(str.charAt(i));
sb.append('_');
continue;
}
sb.append(str.charAt(i));
}
if(isLetter(str.charAt(i))) { //如果是个字母
if (i == 0) {
if(str.charAt(i) >= 'A' && str.charAt(i) <= 'Z') { //如果他本身就是大写,那么直接加上去
sb.append((char)str.charAt(i));
} else {//如果他是小写,那么就-32
sb.append((char)(str.charAt(i) - 32));
}
continue;
}
if(i>0 && str.charAt(i-1) == ' ') { //如果他是个字母,那就判断他前面是不是空格,如果是,则证明这个字母要大写
if(str.charAt(i) >= 'A' && str.charAt(i) <= 'Z') { //如果他本身就是大写,那么直接加上去
sb.append((char)(str.charAt(i)));
} else {//如果他是小写,那么就-32
sb.append((char)(str.charAt(i) - 32));
}
continue;
}
sb.append((char)(str.charAt(i)));
}
}
if(sb.charAt(0) == ' ') {
sb.deleteCharAt(0);
}
return sb.toString();
}
private boolean isLetter(char charAt) {
if((charAt >= 'A' && charAt <= 'Z') || (charAt >= 'a' && charAt <= 'z')) {
return true;
}
return false;
}
public static void main(String[] args) {
Solution sl = new Solution();
String str1 = " this is a 99cat ";
str1 = sl.simpleStringActiong(str1);
System.out.println(str1);
System.out.println(str1.length());
}
}
别人写的,不确定是不是官方的
因为方法一二三都不是我写的,所以思路不一定和我的相同,自行理解。
方法一:
package Question1_9;
import java.util.Scanner;
import java.util.Vector;
public class Question2 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String string=scanner.nextLine();
Vector<Character>vector=new Vector<Character>();
for (int i = 0; i < string.length(); i++) {
vector.add(string.charAt(i));
}
try {
int index=0;
while (index<vector.size()) {
if(index==0&&vector.elementAt(index)>='a'&&vector.elementAt(index)<='z'){
vector.set(index, (char)(vector.elementAt(index)-('a'-'A')));
}else if(vector.elementAt(index-1)==' '&&vector.elementAt(index)==' '){
vector.remove(index);
index--;
}else if (vector.elementAt(index-1)==' '&&(vector.elementAt(index)>='a'&&vector.elementAt(index)<='z')) {
vector.set(index, (char)(vector.elementAt(index)-('a'-'A')));
}else if((vector.elementAt(index)>='a'&&vector.elementAt(index)<='z')&&(vector.elementAt(index-1)>='0'&&vector.elementAt(index-1)<='9')){
vector.add(index, '_');
index++;
}else if((vector.elementAt(index-1)>='a'&&vector.elementAt(index-1)<='z')&&(vector.elementAt(index)>='0'&&vector.elementAt(index)<='9')){
vector.add(index, '_');
index++;
}
index++;
}
for (int i = 0; i <vector.size(); i++) {
System.out.print(vector.elementAt(i));
}
System.out.println();
} catch (ArrayIndexOutOfBoundsException e) {
// TODO: handle exception
}
}
}
方法二:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 本题目即是要求程序对用户输入的串进行处理。具体规则如下:
*1. 把每个单词的首字母变为大写。
*2. 把数字与字母之间用下划线字符(_)分开,使得更清晰
*3. 把单词中间有多个空格的调整为1个空格。
*我们假设:用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号。每个单词间由1个或多个空格分隔。
*假设用户输入的串长度不超过200个字符。
*/
public class SimpleString {
public static void main(String args[]){
String str="";
str=(new Scanner(System.in)).nextLine();
String []str1=str.split("[ ]+");
for(int i=0;i<str1.length;i++)str1[i]=String.valueOf((char)(str1[i].charAt(0)+('A'-'a')))+str1[i].substring(1);
String s="";
for(int i=0;i<str1.length-1;i++)//System.out.print(str1[i]+" ");
{
s+=str1[i]+" ";
}
s+=str1[str1.length-1];
Pattern p=Pattern.compile("([0-9]+)");
Matcher m=p.matcher(s);
String fin="";
int st=0;
while(m.find()){
int start=m.start();
int end=m.end();
fin+=s.substring(st,start);
if(s.charAt(start-1)!=' ')fin+="_";
fin+=m.group(1);
if(s.charAt(end)!=' ')fin+="_";
st=end;
}
if(st<s.length())fin+=s.substring(st);
System.out.println(fin);
}
}
方法三:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo02 {
public static void print(String[] s){
for(int i=0;i<s.length-1;i++){
System.out.print(s[i]+" ");
}
System.out.println(s[s.length-1]);
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
String[] ss = s.split("[\\s]+");
for(int i=0;i<ss.length;i++){
String up = (""+ss[i].charAt(0)).toUpperCase(); // 大写
StringBuffer sb = new StringBuffer(ss[i]);
ss[i] = sb.replace(0, 1, up).toString();
Matcher m = Pattern.compile("\\d+").matcher(ss[i]);
while(m.find()){
String num = new String(m.group());
String num2 = num;
num2 = "_"+num+"_"; // 数字前添加"_"
ss[i] = ss[i].replace(num, num2);
if(ss[i].startsWith("_")){ // 去头"_"
ss[i] = ss[i].substring(1);
}
if(ss[i].endsWith("_")){ // 去尾"_"
ss[i] = ss[i].substring(0,ss[i].length()-1);
}
}
}
print(ss);
}
}