Java字符串-3

简介: 实例6

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


相关文章
|
27天前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
138 83
|
4月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
75 1
|
1月前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
108 60
|
27天前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
55 26
|
1月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
49 8
|
1月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
51 6
|
2月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
58 15
|
2月前
|
Java
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
61 4
|
3月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
57 3