标題串的簡單處理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);
}
}