`
1140566087
  • 浏览: 547799 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
博客专栏
2c4ae07c-10c2-3bb0-a106-d91fe0a10f37
c/c++ 入门笔记
浏览量:18077
3161ba8d-c410-3ef9-871c-3e48524c5263
Android 学习笔记
浏览量:309547
Group-logo
J2ME 基础学习课程集
浏览量:18008
A98a97d4-eb03-3faf-af96-c7c28f709feb
Spring 学习过程记录...
浏览量:17196
社区版块
存档分类
最新评论

字符串的拼接

阅读更多
在实际的开发工作中,对字符串的处理是最常见的编程任务。本题目即是要求程序对用户输入的串进行处理。具体规则如下:
1. 把每个单词的首字母变为大写。
2. 把数字与字母之间用下划线字符(_)分开,使得更清晰
3. 把单词中间有多个空格的调整为1个空格。
例如:
用户输入:
you and     me what  cpp2005program
则程序输出:
You And Me What Cpp_2005_program
用户输入:
this is     a      99cat
则程序输出:
This Is A 99_cat

我们假设:用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号。每个单词间由1个或多个空格分隔。
假设用户输入的串长度不超过200个字符。
要求考生把所有类写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。请不要使用package语句。
另外,源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。



package 字符串拼接;

import java.util.ArrayList;
import java.util.Scanner;

//you and     me what  cpp2005program
//则程序输出:
//You And Me What Cpp_2005_program

public class Main {
	public static void main(String[] args){
		String x = new Scanner(System.in).nextLine();
		combineStr(x);
	}

	public static void combineStr(String x){
		
		//获取处理后的数据集合
		ArrayList<String> list = repair(x);

		//用于判断数字的字符串
		String intStr = "0123456789";

		//获取每个字符串进行字符的拼接转换
		String result = "";
		for(int i=0;i<list.size();i++){
			//取出一个字符
			String temp = list.get(i);
			
			//初始化结果值
			result = temp;
		
			//进行数字与字母的判断
			for(int k=0;k<temp.length()-1;k++){
				
				if(intStr.indexOf(temp.charAt(k))!=-1 && intStr.indexOf(temp.charAt(k+1))==-1){		// 此时判断条件为数字
					// 8a	返回替换后的字符,原字符不变
					result = result.replace(temp.substring(k, k+2), (temp.charAt(k)+"_"+temp.charAt(k+1)));
			
				}else if(intStr.indexOf(temp.charAt(k))==-1 && intStr.indexOf(temp.charAt(k+1))!=-1){	//字母数字
					
					result = result.replace(temp.substring(k, k+2), (temp.charAt(k)+"_"+temp.charAt(k+1)));
	
				}
			}
			System.out.print(result+" ");
		}
	}

	//获取用户输入的,去掉重复的空白符
	public static ArrayList<String> repair(String x){
		
		//保存首字符转为大写后的单词
		ArrayList<String> list = new ArrayList<String>();
		
		//用于判断数字的字符串
		String intStr = "0123456789";

		String[] arr = x.split(" ");

		for(int i=0;i<arr.length;i++){
			if(!arr[i].equals("")){
				//对每一个字符进行判断
				if( intStr.indexOf(arr[i].charAt(0))==-1){   // 对应的字符为字母而不是数字,==-1表示没有找到数字,则为字母
					String newString = (arr[i].charAt(0)+"").toUpperCase()+arr[i].substring(1);
					list.add(newString);
				}else{
					list.add(arr[i]);
				}
			}
		}
		return list;
	}
}

1
2
分享到:
评论
9 楼 kjmmlzq19851226 2013-07-09  
1140566087 写道
kjmmlzq19851226 写道
不知道你有没有发现一个问题?当你输入a1b2c3d4时,得到的输出为A_1b_2c_3d_4,而不是A_1_b_2_c_3_d_4。因为m.find()会自动设置next index,所以while (m.find()) {
s = s.replace(m.group(), m.group().substring(0, 1) + "_" + m.group().substring(1));
}应该修改为int i = 0;while (m.find(i)) {
s = s.replace(m.group(), m.group().substring(0, 1) + "_" + m.group().substring(1));
i++;}


每种解法都有自己的特点,我写的只是其中的一种,也不一定是正则就是最简单的 !

同意,有时候本来一个简单的问题非要人为的去复杂化,这就是目前我面对的环境,不知道你有没有遇到这样的情况
8 楼 1140566087 2013-07-08  
kjmmlzq19851226 写道
不知道你有没有发现一个问题?当你输入a1b2c3d4时,得到的输出为A_1b_2c_3d_4,而不是A_1_b_2_c_3_d_4。因为m.find()会自动设置next index,所以while (m.find()) {
s = s.replace(m.group(), m.group().substring(0, 1) + "_" + m.group().substring(1));
}应该修改为int i = 0;while (m.find(i)) {
s = s.replace(m.group(), m.group().substring(0, 1) + "_" + m.group().substring(1));
i++;}


每种解法都有自己的特点,我写的只是其中的一种,也不一定是正则就是最简单的 !
7 楼 kjmmlzq19851226 2013-07-08  
不知道你有没有发现一个问题?当你输入a1b2c3d4时,得到的输出为A_1b_2c_3d_4,而不是A_1_b_2_c_3_d_4。因为m.find()会自动设置next index,所以while (m.find()) {
s = s.replace(m.group(), m.group().substring(0, 1) + "_" + m.group().substring(1));
}应该修改为int i = 0;while (m.find(i)) {
s = s.replace(m.group(), m.group().substring(0, 1) + "_" + m.group().substring(1));
i++;}
6 楼 1140566087 2013-07-08  
kjmmlzq19851226 写道
public StringBuffer changeString(String content) {
String patSpace = "\\s{2,}"; // 匹配连续空格
content = Pattern.compile(patSpace).matcher(content).replaceAll(" ");
String[] contents = content.split("\\s");
StringBuffer result = new StringBuffer(); // 最终输出
for (String s : contents) {
String patFirst = "^[a-z]"; // 匹配小写首字母
Boolean isLower = Pattern.compile(patFirst).matcher(s).find();
if (isLower) { // 首字母大写
s = Pattern.compile("^[a-z]").matcher(s)
.replaceAll(s.substring(0, 1).toUpperCase());
}
String patOther = "[a-zA-Z]\\d|\\d[a-zA-Z]"; // 匹配数字毗邻字母组合
Matcher m = Pattern.compile(patOther).matcher(s);
while (m.find()) {
// 字母、数字添加下划线分隔
s = s.replace(m.group(), m.group().substring(0, 1) + "_" + m.group().substring(1));
}
result.append(s).append(" ");
}
return result;
}


使用正则啊,可以! 谢啦...
5 楼 kjmmlzq19851226 2013-07-08  
public StringBuffer changeString(String content) {
String patSpace = "\\s{2,}"; // 匹配连续空格
content = Pattern.compile(patSpace).matcher(content).replaceAll(" ");
String[] contents = content.split("\\s");
StringBuffer result = new StringBuffer(); // 最终输出
for (String s : contents) {
String patFirst = "^[a-z]"; // 匹配小写首字母
Boolean isLower = Pattern.compile(patFirst).matcher(s).find();
if (isLower) { // 首字母大写
s = Pattern.compile("^[a-z]").matcher(s)
.replaceAll(s.substring(0, 1).toUpperCase());
}
String patOther = "[a-zA-Z]\\d|\\d[a-zA-Z]"; // 匹配数字毗邻字母组合
Matcher m = Pattern.compile(patOther).matcher(s);
while (m.find()) {
// 字母、数字添加下划线分隔
s = s.replace(m.group(), m.group().substring(0, 1) + "_" + m.group().substring(1));
}
result.append(s).append(" ");
}
return result;
}
4 楼 kjmmlzq19851226 2013-07-08  
1140566087 写道
kjmmlzq19851226 写道
有点儿混乱,代码也不够简洁,像匹配纯数字这种问题最好使用正则。而且处理的问题比较奇怪,如果用户输入youand,你也认为这是一个单词?

这个,按题目的要求是单词之间留有空格的!不考试连续输入的情况

这样的嗦,首先做整个字符串的空格匹配,也就是说保证第一次过滤后没有重复空格的出现;
然后按照空格分隔成String[],对每一个元素做第一个字符匹配,也就是字符替换大写;最后做下划线匹配,诸如[d][a-z]/[A-Z]或[a-z]/[A-Z][d]做下划线添加。都用正则代码更简单易懂。
3 楼 1140566087 2013-07-06  
kjmmlzq19851226 写道
有点儿混乱,代码也不够简洁,像匹配纯数字这种问题最好使用正则。而且处理的问题比较奇怪,如果用户输入youand,你也认为这是一个单词?

虚心受教,请问你有没更精简的方法,更加的明白,如果可以的话,求指导!
2 楼 1140566087 2013-07-06  
kjmmlzq19851226 写道
有点儿混乱,代码也不够简洁,像匹配纯数字这种问题最好使用正则。而且处理的问题比较奇怪,如果用户输入youand,你也认为这是一个单词?

这个,按题目的要求是单词之间留有空格的!不考试连续输入的情况
1 楼 kjmmlzq19851226 2013-07-05  
有点儿混乱,代码也不够简洁,像匹配纯数字这种问题最好使用正则。而且处理的问题比较奇怪,如果用户输入youand,你也认为这是一个单词?

相关推荐

Global site tag (gtag.js) - Google Analytics