实例6
package cn.jbit.classandobject; import java.util.*; public class Verify{ public static void main(String[] args) { // 声明变量 boolean fileCorrect = false; //标识文件名是否正确 boolean emailCorrect = false; //标识E-mail是否正确 System.out.print("---欢迎进入作业提交系统---"); Scanner input = new Scanner(System.in); System.out.println("请输入Java文件名: "); String fileName = input.next(); System.out.print("请输入你的邮箱:"); String email = input.next(); //检查Java文件名 int index = fileName.lastIndexOf("."); //"."的位置 if(index!=-1 && index!=0 && fileName.substring(index+1, fileName.length()).equals("java")){ fileCorrect = true; //标识文件名正确 }else{ System.out.println("文件名无效。"); } //检查你的邮箱格式 if(email.indexOf('@')!=-1 && email.indexOf('.')>email.indexOf('@')){ emailCorrect = true; //标识E-mail正确 }else{ System.out.println("E-mail无效。"); } //输出检测结果 if(fileCorrect && emailCorrect){ System.out.println("作业提交成功!"); }else{ System.out.println("作业提交失败!"); } } }
示例6的运行结果如图15.13所示。
图15.13示例6的运行结果
判断Java文件名是否有效时,使用的判断条件如下。
index!=-1 && index!=0 && fileName.substring(index+1, fileName.length()).equals("java")
index是字符 "." 在字符串中的位置,条件 "index!=-1 && index!=0" 是指字符串中包含点号并且点号不在首位。除此之外,通过substring方法获得字符后的字符串,然后判断是否是 "java",只有三个条件全部满足,才是合法的文件名。在判断邮箱名时,检查是否包含字符 "@",是否包含字符 "." 并且检查字符 "@" 是否在字符 "." 的前面。
15.2.3字符串的拆分
字符串的拆分在实际应用中也是经常用到的。
问题:有一段歌词,每句都以空格“”结尾,请将歌词的每句按行输出,效果如图15.14所示。
图15.14字符串的拆分
分析:要实现这个需求,只要将每句歌词按照空格“ ”拆分即可。 Java 的 String 类提供了一个拆分字符串的方法 split(), 将一个字符串分割为子字符串,结果作为字符串数组返回。
语法:
字符串 1. split (String separator, int limit);
其中:
(1) separator 可选项,标识拆分字符串时使用一个或多个字符。如果不选择该项,则返回包含该字符串所有单个字符的元素数组。
(2) limit 可选项,该值用来限制返回数组中的元素个数。
示例7
package cn.jbit.classandobject; public class Lyric { /** * 拆分歌词 * */ public static void main(String[] args) { String words="长亭外 古道边 芳草碧连天 晚风扶 柳笛声残 夕阳山外山"; String[] printword=new String[100];//接收数组 System.out.println("***原歌词格式***\n"+words); System.out.println("\n***拆分后歌词格式***"); printword=words.split(" ");//按照空格进行拆分 for(int i=0;i<printword.length;i++){ System.out.println(printword[i]);//打印输出 } } }
运行示例 7, 效果如图 15.14 所示。
经验:
String 类操作字符串的方法很多,本章讲解了一些常见的方法,大家如果还想更深入地了解这些方法的用法,或者在实际开发中需要使用的方法本章没有讲解,可以通过查看 Java API 帮助文档,进行深入学习。
另外,由于本章讲解的方法比较多,建议学员在课下对这些方法进行汇总,以加强记忆和理解。
15.2.4 技能训练
上机练习2
练习——实现会员注册升级
需求说明
为了方便将抽奖结果及时反馈给客户,商场注册时要求会员提供身份证号和电话。要求:
身份证号必须是 15 位或 18 位,手机号必须是 11 位,座机号必须以字符 "一" 连接, "一" 前必须是 4 位数,"一" 后必须是 7 位数。
验证通过,方可注册成功,如果验证不通过,提示哪一步有错误。程序运行结果如图 15.15 所示。
图 15.15 上机练习 2 的运行结果
提示:判断座机的电话号码时,按照字符符号进行拆分,然后判断长度。
参考代码展示:
package cn.jbit.classandobject; import java.util.Scanner; /** * 上机阶段2: 实现会员注册升级 * */ public class Register2 { /** * 验证注册信息 * @return flag 验证信息 */ public String verify(String id,String cell,String phone){ String flag="注册成功!"; String[] splitphone=new String[3]; splitphone=phone.split("-",2); if(id.length()!=16 && id.length()!=18){ flag="身份证号必须是16位或18位!"; }else if(cell.length()!=11){ flag="手机号码必须是11位!"; }else if(splitphone[0].length()!=4 && splitphone[0].length()!=7){ flag="座机号码区号必须为4位,电话号码必须是7位!"; } return flag; } public static void main(String[] args) { Register2 r=new Register2(); Scanner input = new Scanner(System.in); String ID,p1,p2; String resp; System.out.println("***欢迎进入注册系统*** \n"); do{ System.out.print("请输入身份证: "); ID=input.next(); System.out.print("请输入手机号: "); p1=input.next(); System.out.print("请输入座机号: "); p2=input.next(); resp=r.verify(ID, p1, p2); System.out.println(resp); }while(!resp.equals("注册成功!")); } }
上机练习3
练习——判断字符出现次数
需求说明
输入一个字符串,再输入要查找的字符,判断该字符在该字符串中出现的次数。
程序运行结果如图 15.16 所示。
图 15.16 上机练习 3 的运行结果
提示:
编写方法。
public int counter(String inputs,String word){ int counter=0;//计数器,初始化0 //…… return counter; }
使用 substring() 方法将字符串的每个字符存入数组。
比较数组中每个字符是否与要求的字符相等,并计数。
参考代码展示:
package cn.jbit.classandobject; import java.util.Scanner; /** * 上机阶段3: 统计字符出现次数 * */ public class Counter { public int counter(String inputs,String word){ int counter=0;//计数器,初始化0 String[] temps=new String[inputs.length()]; //字符串转换成数组 for(int i=0;i<temps.length;i++){ temps[i]=inputs.substring(i,i+1); } //比较字母,计数 for(int j=0;j<temps.length;j++){ if(temps[j].equals(word)){ counter++; } } return counter; } public static void main(String[] args) { Scanner myinput=new Scanner(System.in); Counter cnt=new Counter(); //定义2个变量,接收用户的输入 String myString; String myWord; System.out.print("请输入一个字符串:"); myString=myinput.next(); System.out.print("请输入要查找的字符:"); myWord=myinput.next(); //调用方法,输出结果 int geshu=cnt.counter(myString,myWord); System.out.print("\""+myString+"\"中包含"+geshu+"个\""+myWord+"\"。"); } }
15.3 String Buffer 类
在 Java 中,除了使用 String 类存储字符串之外,还可以使用 StringBuffer 类存储字符串。StringBuffer也是 Java 开发人员给我们提供的用于处理字符串的一个类,而且它是比 String 类更高效的存储字符串的一种引用数据类型。特别是对字符串进行连接操作时,使用 StringBuffer 类可以大大提高程序的执行效率。
15.3.1 如何使用 StringBuffer 类
StringBuffer 类位于 java.lang 包中,是 String 类的增强类。使用 StringBuffer 类也需要两步完成。
1. 声明 StringBuffer 对象并初始化
//声明一个空的 StringBuffer 对象 StringBuffer sbl = new StringBuffer(); //声明一个字符串”青春无悔” StringBuffer sb2 = new StringBuffer ("青春无悔”);
2. 使用 StringBuffer 对象
StringBuffer 类提供了很多方法以供使用,调用时使用操作符完成。
15.3.2 常用的 StringBuffer 类方法
下面介绍几个比较常用的 StringBuffer 类提供的方法。
语法:
字符串 1.toString();
将 StringBuffer 类型的字符串 1 转换为 String 类型的对象并返回。
例如:
String s1 = sb2.toString();
语法:
字符串 1. append(字符串 2);
将字符串 2 连接到字符串 1 后并返回。
该方法和 String 类的 concat()方法一样,都是把一个字符串追加到另一个字符串后面,所不同的是 String 中只能将 String 类型的字符串追加到一个字符串后,而 StringBuffer 可以将任何类型的值追加到字符串之后。
示例8
package cn.jbit.classandobject;
public class sbAppend { public static void main(String[] args) { StringBuffer sb = new StringBuffer("青春无悔"); int num = 110; //在字符串后面追加字符串 StringBuffer sb1 = sb.append("我心永恒"); System.out.println(sb1); //在字符串后面追加字符 StringBuffer sb2 = sb1.append('啊'); System.out.println(sb2); //在字符串后面追加整型数字 StringBuffer sb3 = sb2.append(num); System.out.println(sb3); } }
运行示例 8, 运行结果如图 15.17 所示。
图 15.17 示例 8 的运行结果
语法:
字符串 1.insert(位置,参数);
将参数插入字符串 1 的指定位置(int 类型)后并返回。参数可以是包括 String 的任何类型。
问题:编写一个方法,实现将一个数字字符串转换成逗号分隔的数字串,即从右边开始每三个数字用逗号分隔,运行结果如图 15.18 所示。
图 15.18 用逗号分隔字符串
分析:利用 StringBuffer 类的 length() 方法,获取数字串的长度,使用 for 循环从后向前每隔三位插入一个逗号。
示例9
package cn.jbit.classandobject; import java.util.*; public class TestInsert { /** * 每隔三位插入逗号 * */ public static void main(String[] args) { Scanner input = new Scanner(System.in); //接收数字串,存放于StringBuffer类型的对象中 System.out.print("请输入一串数字: "); String nums = input.next(); StringBuffer str=new StringBuffer(nums); //从后往前每隔三位添加逗号 for(int i=str.length()-3;i>0;i=i-3){ str.insert(i,','); } System.out.print(str); } }
运行示例 9, 运行结果如图 15.18 所示。
15.3.3 技能训练
上机练习4
指导——实现商品批发总金额的显示
训练要点
StringBuffer 类的使用。
方法的定义和使用。
需求说明
用户登录,输入用户名和密码,实现登录验证。
验证通过后,显示批发商品的信息,包括商品名称和价格。
输入批发商品编号和数量,显示总金额。
价格的显示都采用小数点前每隔三位一个逗号的形式。
程序运行结果如图 15.19 所示。
图 15.19 上机练习 4 的运行结果
实现思路及关键代码
(1) 创建类 Goods 。
(2) 创建属性,用来存放商品名及对应的价格。
String[] goods=new String[]{"电风扇","洗衣机","电视机","冰 箱","空调机"};
double[] price=new double[]{124.23,4500,8800.90,5000.88,4456,12000.46};
(3) 创建方法 login( ), 用来验证登录信息。
public boolean login(){ boolean flag=false; //……判断登录信息 return flag; }
(4) 创建方法 show( ), 用来显示商品名称及价格。
(5) 创建方法 change( ), 用来格式化输出。
public StringBuffer change(double d){ StringBuffer str=new StringBuffer(String.valueOf(d)); for(int i=str.indexOf(".")-3;i>0;i=i-3){ str.insert(i,','); } return str; }
(6) 编写 main( )方法,实现登录通过后,显示商品,输入批发商品编号和数量,完成总价格的格式化输出。
参考代码展示:
package cn.jbit.classandobject; import java.util.Scanner; /** * 上机阶段4: 登录并购买商品 * */ public class Goods { String[] goods=new String[]{"电风扇","洗衣机","电视机","冰 箱","空调机"}; double[] price=new double[]{124.23,4500,8800.90,5000.88,4456,12000.46}; /** * 登录验证 * @return flag登录是否成功,true为成功 */ public boolean login(){ boolean flag=false; Scanner input = new Scanner(System.in); System.out.print("请输入用户名: "); String name=input.next(); System.out.print("请输入密码: "); String pwd=input.next(); if(name.equals("Wangfeng")&&pwd.equals("123.com")){ System.out.println("登录成功! "); flag=true; }else{ System.out.println("用户名或密码不匹配,登录失败!"); } return flag; } /** * 显示格式转换,每隔三位加逗号 * @param d */ public StringBuffer change(double d){ StringBuffer str=new StringBuffer(String.valueOf(d)); for(int i=str.indexOf(".")-3;i>0;i=i-3){ str.insert(i,','); } return str; } /** * 商品显示 */ public void showGoods(){ System.out.print("*********欢迎进入商品批发城*********"); System.out.print("\n\t编号\t商品\t价格\n"); for(int i=0;i<goods.length;i++){ System.out.print("\t"+(i+1)); System.out.print("\t"+goods[i]); System.out.print("\t"+change(price[i])+"\n"); } System.out.println("**********************************"); } public static void main(String[] args) { Scanner input=new Scanner(System.in); Goods g=new Goods(); int serial,num; double totle=0; if(g.login()){ g.showGoods(); System.out.print("请输入您批发的商品编号:"); serial=input.nextInt(); System.out.print("请输入批发数量:"); num=input.nextInt(); totle=g.price[serial-1]*num;//计算总金额 System.out.print("您需要付款:"+g.change(totle)); } } }