目录
实例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));
}
}
}