1.小小ATM
题目:
* 自动取款机又称ATM(Automated Teller Machine的缩写),它是一种高度精密的机电一体化装置,利用磁性代码卡或智能卡实现金融交易的自助服务,代替银行柜面人员的工作。持卡人可以使用信用卡或储蓄卡,根据密码办理自动取款、查询余额、转账、现金存款,存折补登,购买基金,更改密码,缴纳手机话费等业务。
* 请在start-end区域中填充代码,实现一个ATM取款机小程序,效果图如下:
* 欧迎使用中国人民银行ATM取款机
* 输入取款金额:100
* 900是否继续(’1’:结束,’2’:继续):2
* 剩余金额:
* 输入取款金额:999
* 目前余额:900无法满足您的取款需求!
* 输入取款金额:100
* 剩余金额:800是否继续(’1’:结束,’2':继续):1取款结束!
练习模板:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
int my_money = 1000;//定义一个变量保存我的金额
int cash = 0;//定义一个变量保存我当下要取的金额
int is_get_cash = 0;//定义一个变量保存我是否8继续取款的决定('1':结束,'2':继续)
Scanner input = new Scanner(System.in);
System.out.println("欢迎使用中国人民银行ATM取款机");
do{
/********start**********/
/*********end**********/
}while(my_money>0);
System.out.println("取款结束!");
}
}
参考答案:
/**
* 自动取款机又称ATM(AutomatedTeller Machine的缩写),它是一种高度精密的机电一体化装置,利用磁性代码卡或智能卡实现金融交易的自助服务,代替银行柜面人员的工作。持卡人可以使用信用卡或储蓄卡,根据密码办理自动取款、查询余额、转账、现金存款,存折补登,购买基金,更改密码,缴纳手机话费等业务。
* 请在start-end区域中填充代码,实现一个ATM取款机小程序,效果图如下:
* 欧迎使用中国人民银行ATM取款机
* 输入取款金额:100
* 900是否继续(’1’:结束,’2’:继续):2
* 剩余金额:
* 输入取款金额:999
* 目前余额:900无法满足您的取款需求!
* 输入取款金额:100
* 剩余金额:800是否继续(’1’:结束,’2':继续):1取款结束!
* */
import java.util.Scanner;
public class Main {
public static void main(String[] args){
int my_money = 1000;//定义一个变量保存我的金额
int cash = 0;//定义一个变量保存我当下要取的金额
int is_get_cash = 0;//定义一个变量保存我是否8继续取款的决定('1':结束,'2':继续)
Scanner input = new Scanner(System.in);
System.out.println("欢迎使用中国人民银行ATM取款机");
do{
/********start**********/
System.out.println("请输入取款金额:");
cash = input.nextInt();//存放取款金额
//这里有两种情况,钱不够和钱够
if(cash<=my_money){//钱够
my_money-=cash;
System.out.println("剩余金额:"+my_money+",是否继续:(‘1’:结束,‘2’:继续)");
is_get_cash=input.nextInt();
if(is_get_cash==1) break;//等于1跳出循环,取款结束
}
else{//钱不够
System.out.println("目前余额:"+my_money+"无法满足您的取款需求!");
}
/*********end**********/
}while(my_money>0);
System.out.println("取款结束!");
}
}
这道题几乎没有涉及到什么特殊的知识点,你只要搞清楚取钱给钱的流程就够了,逻辑不要写反这题很容易。
2.算算最高分
题目:
Java面向对象程序设计作为计算机类学生的专业核心课程,
为后续学习操作系统、数据库原理与应用、软件工程、软件项目实训等课程奠定编程基础。因专业学生人数多故开设了多个课程班级,现需要对所有Java课程班级的成绩进行统计。
在start-end区域中填充代码,编写一个能计算所有Java课程班级的平均分和最高分的小程序。
输入说明
3表示班级数,4表示第一个班级人数,79,98,88,99为这4位学生的Java成绩;2表示第二个班级人数,87,85为这2位学生的Java成绩;4表示第三个班级人数,
67,78,89,69为这4位学生的Java成绩
输出说明
99.0是所有人的最高分,83.9是所有人的平均成绩
练习模板:
/*
* 题目描述
* 2 Java面向对象程序设计作为计算机类学生的专业核心课程
为后续学习操作系统、数据库原理与应用、软件工程、软件项目实训等课程奠定编程基础。因专业学生人数多故开设了多个课程班级,
* 现需要对所有Java课程班级的成绩进行统计。
在start-end区域中填充代码,编写一个能计算所有Java课程班级的平均分和最高分的小程序。
输入说明
3表示班级数,4表示第一个班级人数,79,98,88,99为这4位学生的Java成绩;2表示第二个班级人数,87,85为这2位学生的Java成绩;
4表示第三个班级人数,67,78,89,69为这4位学生的Java成绩
输出说明
99.0是所有人的最高分,83.9是所有人的平均成绩
*
* */
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入班级数量");
double[][] scores = new double[scanner.nextInt()][];//班级数就是二维数组行数
for(int i=0;i<scores.length;i++){
System.out.println("请输入第"+(i+1)+"个班级学生人数");
/**********Begin**********/
/**********End************/
for(int j=0;j<scores[i].length;i++){
System.out.println("请输入本班第"+(j+1)+"个学生的Java成绩:");
/**********Begin**********/
/**********End************/
}
}
/**********Begin**********/
/**********End************/
}
}
参考答案:
/*
* 题目描述
* 2 Java面向对象程序设计作为计算机类学生的专业核心课程
为后续学习操作系统、数据库原理与应用、软件工程、软件项目实训等课程奠定编程基础。因专业学生人数多故开设了多个课程班级,
* 现需要对所有Java课程班级的成绩进行统计。
在start-end区域中填充代码,编写一个能计算所有Java课程班级的平均分和最高分的小程序。
输入说明
3表示班级数,4表示第一个班级人数,79,98,88,99为这4位学生的Java成绩;2表示第二个班级人数,87,85为这2位学生的Java成绩;
4表示第三个班级人数,67,78,89,69为这4位学生的Java成绩
输出说明
99.0是所有人的最高分,83.9是所有人的平均成绩
*
* */
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入班级数量");
double[][] scores = new double[scanner.nextInt()][];//班级数就是二维数组行数
for(int i=0;i<scores.length;i++){
System.out.println("请输入第"+(i+1)+"个班级学生人数");
/**********Begin**********/
scores[i]=new double[scanner.nextInt()];
/**********End************/
for(int j=0;j<scores[i].length;i++){
System.out.println("请输入本班第"+(j+1)+"个学生的Java成绩:");
/**********Begin**********/
scores[i][j]=scanner.nextDouble();
/**********End************/
}
}
/**********Begin**********/
double aver=0;
double max=0;
int num=0;
for(int i=0;i<scores.length;i++){
for(int j=0;j<scores[i].length;i++){
if(max<scores[i][j])max=scores[i][j];
aver+=scores[i][j];
num++;
}
}
aver=aver/num*1.0;
System.out.println(max+"是所有人的最高分,"+aver+"是所有人的平均成绩");
/**********End************/
}
}
知识点梳理:
这个题主要考二维数组的应用。
double[][] scores = new double[scanner.nextInt()][];
先定义了二维数组的行数。
scores[i]=new double[scanner.nextInt()];
再定义二维数组的列数。
3.汪汪和喵喵
题目:
动物(CAnima) 是生物的一个种类。 它们一舰以有机物为食,是鲍够自主运动或相够活动的有感党的生物。人类也是动物之一。
根据化石研究地球上最早出现的动物源于海洋。早期的海洋动物经过澧长的地质时期。逐渐澳化出各种分支,丰富了早期的地球生命形态。在人类出现以前,史前动物便已出现,并在各自的活动期得到繁荣发展。后来,它们在不断支换的生存环境下相继灭绝。但是,地球上的动物仍以从低等到美等、从简单到這杂的趋势不断进化并繁行,并有了如今的多样性。
创建一个父类动物类(Animals) 。以及两个子类,分别是猫类(Cat) 和狗类(Dogl。动物类叫声为输出“叽里咕鲁”。猫类, 狗类分别发出叫声“唱有”,“注汪”,输入动物名,输出相应动物叫声,输出格式为动物名动物叫声。
父类有属性姓名(name)
在父类构造方法中对属生姓名附值。
在父类中定义getName0oshout()用于获职动物的姓名信意以及输出动物的叫声。
猫和狗继承动物类,通过在子类构造方法中调用父类构造方法,分别构建描和狗对象。通过子类重写父类的shout0输出动物的叫声。
练习模板:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String animal = sc.next();
switch(animal){
case("dog"):{
//创建Dog类对象dog,通过有参构造方法实例化该对象
//shout()方法,输出”dog:汪汪“
/*********begin************/
/*********end**************/
}
case("cat"):{
//创建Cat类对象cat,通过有参构造方法实例化该对象
//shout()方法,输出”cat:喵喵“
/*********begin************/
/*********end**************/
}
default:{
//创建Animal类对象animal,通过有参构造方法实例化该对象
//shout()方法,输出”animal:叽里咕噜“
/*********begin************/
/*********end**************/
}
}
}
}
//父类Animals 封装私有属性name
//有参构造方法初始化name
//属性的get方法
//shout方法,输出”叽里咕噜“
class Animals{
/*************begin************/
/**********end****************/
}
//Dog继承自Animal类
//有参构造方法初始化name
//重写父类shout()方法
class Dog extends Animals{
/**********begin*************/
/**********end**************/
}
//Cat继承自Animals类
//有参构造方法初始化name
//重写父类shout()方法
class Cat extends Animals{
/***********begin*************/
/*************end**************/
}
参考答案:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String animal = sc.next();
switch(animal){
case("dog"):{
//创建Dog类对象dog,通过有参构造方法实例化该对象
//shout()方法,输出”dog:汪汪“
/*********begin************/
Dog dog = new Dog(animal);
dog.get();
dog.shout();
break;
/*********end**************/
}
case("cat"):{
//创建Cat类对象cat,通过有参构造方法实例化该对象
//shout()方法,输出”cat:喵喵“
/*********begin************/
Cat cat = new Cat(animal);
cat.get();
cat.shout();
break;
/*********end**************/
}
default:{
//创建Animal类对象animal,通过有参构造方法实例化该对象
//shout()方法,输出”animal:叽里咕噜“
/*********begin************/
Animals animals = new Animals(animal);
animals.get();
animals.shout();
break;
/*********end**************/
}
}
}
}
//父类Animals 封装私有属性name
//有参构造方法初始化name
//属性的get方法
//shout方法,输出”叽里咕噜“
class Animals{
/*************begin************/
private String name;
Animals(String name){
this.name=name;
}
public void get(){
System.out.print(name+":");
}
public void shout(){
System.out.println("叽里咕噜");
}
/**********end****************/
}
//Dog继承自Animal类
//有参构造方法初始化name
//重写父类shout()方法
class Dog extends Animals{
/**********begin*************/
String name;
Dog(String name) {
super(name);
}
public void shout(){
System.out.println("汪汪");
}
/**********end**************/
}
//Cat继承自Animals类
//有参构造方法初始化name
//重写父类shout()方法
class Cat extends Animals{
/***********begin*************/
String name;
Cat(String name) {
super(name);
}
public void shout(){
System.out.println("喵喵");
}
/*************end**************/
}
知识点梳理:
这道题考的是继承,继承其实算比较简单好理解的了,子类继承父类所有方法和属性,并且可以在子类中重写父类中的方法,你也可以理解成if的嵌套,他们在逻辑上有些相似。
其他语法自己看书,这里给你写几个需要注意的点:
创建类的对象
在创建类的对象时要分清到底要创建的是哪个类,例如这个题中,case==“dog”时,我们就需要创建animal类的子类Dog,因为我们最终要调用dog重写的shout方法。
封装属性
封装属性的大白话就是将一个类里所有要用的东西写在这个类里面,你可以理解成你想要做一件事,你需要事先准备好所有你要的东西,然后把他们装进背包。那么这个背包就是类,而那些“东西”就是你需要封装的属性。
super关键字
子类不继承父类的构造方法,如果想要使用就要在子类的构造方法里使用super关键字,super必须是子类构造方法中的第一条语句。
在调用时,父类可能有多个构造方法,但他们的构造方法的参数一定不一样,认准你要调用的构造方法的参数。例如父类中:
class Father{
String name;
int age;
String occupation;
Father(String name,int age,String occupation){
this.name=name;
this.age=age;
this.occupation=occupation;
}
Father(){
System.out.println("woshinibaba");
}
}
class Son extends Father{
Son(String name,int age,String occupation){
super(name,age,occupation);//参数一定对应
}
Son(){
super();
}
}
this关键字
String name;
int age;
String occupation;
Father(String name,int age,String occupation){
this.name=name;
this.age=age;
this.occupation=occupation;
}
这个就很好理解,我先声明了我这个类里有三个属性,我们写一个构造方法,使得在创建这个对象的时候就可以直接为这三个属性赋值 ,this.name就可以理解为指向,this.name代表的是第一行这个name,=后面的name就是构造方法传值传进来的name,我们用传进来的值为对象的name属性赋值。
PS:还看不懂记下来就完事了,好像就这么多知识点了。
4.天选读书打工人
题目:
/**
* 学生,一般指正在学校、学堂或其他学习地方受教育的人,根据学习的不同阶段,我们可以把学生分为:幼儿园学生、小学生、中学生、高等院校学生(大学生、硕士研究生、博士研究生)等等。学生是一种身份的名词,具有学籍的人都统称学生。
* 工人,通常是指为挣工资而被雇用从事体力或技术劳动的人,他们本身不占有生产资料,只能通过自己的劳动才能获得工资性质的收入。工人一般指工厂中生产工序的人,除了工厂的管理者外,都称为工人。如:操作工人、搬运工人等。
*
* 声明一个名为Person的抽象类,在Person类中声明了三个属性姓名name、年龄age和职业occupation和一个返回String的抽象方法talk();
* 声明一个Student类和一个Worker类,都继承自Person类,添加含有三个参数的构造方法
* 分别实例化Student类和Worker类,分别调用各自类中被复写的talk()方法打印输出信息;
* 输入:
* 张三 20 学生
* 李四 30 工人
* 输出:
* 学生————>姓名:张三,年龄:20,职业:学生!
* 工人————>姓名:李四,年龄:30,职业:工人!
*/
练习模板:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String stuName=sc.next();
int stuAge=sc.nextInt();
String stuOccupation=sc.next();
String worName=sc.next();
int worAge=sc.nextInt();
String worOccupation=sc.next();
/************begin************/
//分别实例化Student类和Worker类的对象,并调用各自的构造方法初始化类属性
//分别调用各自类中被复写的talk()方法 打印信息
/***********end**************/
}
}
//声明一个名为Person的类,在Person类中声明了三个属性name,age,occupation和一个抽象方法——talk()
abstract class Person{
/*********begin*************/
/***********end*************/
}
//Student类继承自Person,添加带三个参数的构造方法,复写talk()方法 返回姓名、年龄和职业信息(“学生————>姓名:name,年龄:age,职业:occupation!")
class Student extends Person{
/*********begin***********/
/*********end*************/
}
//Worker类继承自Person,添加带三个参数的构造方法,复写talk()方法 返回姓名、年龄和职业信息(“学生————>姓名:name,年龄:age,职业:occupation!")
class Worker extends Person{
/***********begin*********/
/**********end***********/
}
参考答案:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String stuName=sc.next();
int stuAge=sc.nextInt();
String stuOccupation=sc.next();
String worName=sc.next();
int worAge=sc.nextInt();
String worOccupation=sc.next();
/************begin************/
//分别实例化Student类和Worker类的对象,并调用各自的构造方法初始化类属性
Student student = new Student(stuName,stuAge,stuOccupation);
Worker worker = new Worker(worName,worAge,worOccupation);
//分别调用各自类中被复写的talk()方法 打印信息
System.out.println(student.talk());
System.out.println(worker.talk());
/***********end**************/
}
}
//声明一个名为Person的类,在Person类中声明了三个属性name,age,occupation和一个抽象方法——talk()
abstract class Person{
/*********begin*************/
String name;
int age;
String occupation;
abstract String talk();
/***********end*************/
}
//Student类继承自Person,添加带三个参数的构造方法,复写talk()方法 返回姓名、年龄和职业信息(“学生————>姓名:name,年龄:age,职业:occupation!")
class Student extends Person{
/*********begin***********/
Student(String name,int age,String occupation){
this.name=name;
this.age=age;
this.occupation=occupation;
}
String talk(){
return "学生————>姓名:"+name+",年龄:"+age+",职业:"+occupation+"!";
}
/*********end*************/
}
//Worker类继承自Person,添加带三个参数的构造方法,复写talk()方法 返回姓名、年龄和职业信息(“学生————>姓名:name,年龄:age,职业:occupation!")
class Worker extends Person{
/***********begin*********/
Worker(String name,int age,String occupation){
this.name=name;
this.age=age;
this.occupation=occupation;
}
String talk(){
return "工人————>姓名:"+name+",年龄:"+age+",职业:"+occupation+"!";
}
/**********end***********/
}
这个也类似,应该都能做出来。
5.字符串小裁缝
题目:
拼接字符串
从键盘输入多个字符串,然后将其拼接成为一个字符串并输出,字符串之间用“”隔开,输入"!”则表示输入结束输入说明
第一次输入hello,第二次输入world,第三次输入!输出说明
结果是hello world
输入示例
hello world!
输出示例
hello world
练习模板:
import java.io.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException{
String str;
Scanner scanner =new Scanner(System.in);
StringBuilder sb = new StringBuilder();
/************begin****************/
/************End******************/
System.out.println(sb);
}
}
参考答案:(常规做法)
/*
* 拼接字符串
从键盘输入多个字符串,然后将其拼接成为一个字符串并输出,字符串之间用“”隔开,输入"!”则表示输入结束输入说明
第一次输入hello,第二次输入world,第三次输入!输出说明
结果是hello world
输入示例
hello world!
输出示例
hello world
*
* */
import java.io.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException{
String str;
Scanner scanner =new Scanner(System.in);
StringBuilder sb = new StringBuilder();
/************begin****************/
str=scanner.next();
while(str.equals("!")==false){
sb.append(str);
sb.append(" ");
str= scanner.next();
}
/************End******************/
System.out.println(sb);
}
}
(另辟蹊径法)
import java.io.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException{
String str;
Scanner scanner =new Scanner(System.in);
StringBuilder sb = new StringBuilder();
String sbb="";
/************begin****************/
str=scanner.next();
while(str.equals("!")==false){
sbb=sbb+str+" ";
str= scanner.next();
}
/************End******************/
System.out.println(sbb);
}
}
这个没什么知识点,就是简单的String类的方法调用。
6.字符串换换换
题目:
字符串计数替换
题目:因为绝大部分计算机都应用于数据处理,所以字符串在程序设计中具有非常重要的地位,许多程序设计语言都增加了对字符串处理的函数或者方法,便于实现对字符串进行统计、排序、解析、截取、反转等操作。
从控制台输入字符串strall“5月1号劳动节,6月1号儿童节,7月1号建党节,8月1号建军节,10月1号国庆节”,统计strall中“号”的次数并输出;输入替换字符串str1,然后将字符串strall中的“号”替换成str1,并输出strall。
请在Begin-End间补齐代码,完成功能。
可以使用提示函数完成。
提示:正则表达式中,\s表示空白,^表集合求反;+表示重复1次及以上
函数提示:
*public String replaceAll(String regex,String replacement)
功能:用给定的字符串replacement替换与给定的正则表达式regex匹配的此字符串的每个子字符串
* public String trim()
功能:返回一个字符串,其值为此字符串,删除任何前导和尾随空格。
* public String, split(Stringregex)
功能:将此字符串拆分为给定的regular expression匹配的字符串数组。
输入示例;
5月1号穿动节,6月1号儿童节,7月1号建党节,8月1号建军节,10月1号国庆节日
5 5月1日劳动节,6月1日儿童节,7月1日建党节,8月1日建军节,10月1日国庆节
练习模板:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String strall,str1,reg;
Scanner sc = new Scanner(System.in);
strall = sc.next();
str1 = sc.next();
/**************begin************/
/***************end*************/
}
}
参考答案:(这题感觉有好多种做法,因为当时不会正则表达式,所以用的下面这种string自带函数做的)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String strall,str1,reg;
Scanner sc = new Scanner(System.in);
strall = sc.next();
str1 = sc.next();
/**************begin************/
int num=0;//用来计数
for(int i=0;i<strall.length();i++){
char ch = strall.charAt(i);
if(ch=='号') num++;//出现一次计数一次
}
System.out.println(num);
System.out.println(strall.replace("号",str1));
/***************end*************/
}
}
正则表达式做法:(讲实话,根本看不懂)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String strall,str1,reg;
Scanner sc = new Scanner(System.in);
strall = sc.next();
str1 = sc.next();
/**************begin************/
//正则表达式法
reg = "[^号]";
String strall1;
strall1 = strall.replaceAll(reg," ");
strall1 = strall1.trim();
String[] strArr = strall1.split("\\s+");
System.out.println(strArr.length);
strall = strall.replaceAll("号",str1);
System.out.println(strall);
/***************end*************/
}
}
这里很明显的字符串有关的知识点,有几个字符串相关的函数比较常用:
//replace函数
函数解释:将某个字符串的某个字符(oldchar)全部替换成另一个字符(newchar).
使用:string1=string.replace(String oldchar,String newchar);
//replaceAll函数
函数解释:*public String replaceAll(String regex,String replacement)
功能:用给定的字符串replacement替换与给定的正则表达式regex匹配的此字符串的每个子字符串
//trim函数
public String trim0
功能:返回一个字符串,其值为此字符串,删除任何前导和尾随空格。
//split函数
这是最基础的函数
* public String split(String regex)
功能:将此字符串拆分为给定的regular expression匹配的字符串数组。
-->正则表达式
正则表达式可以校验字符串是否满足一定的规则,并用来校验数据格式的合法性。
需求:假如现在要求校验一个qq号码是否正确。
规则:6位及20位之内,0不能再开头,必须全部是数字。
用正则表达式
String qq ="123456789";
System.out.println(qq.match("[1-9]\\d{5,19}"));
在这之中[1-9]表示第一个数只能是1-9,\\d表示多个数,{5,19}表示除第一个数5-19位。
作用:
作用一:校验字符串是否满足规则
作用二:在一段文本中查找满足要求的内容
![](https://i-blog.csdnimg.cn/blog_migrate/783382e648d3ce96e2d6b8de3d8c17e9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e4b1bbaf4edd8c3361022492fb8e8d0f.png)
(来自黑马程序员)黑马程序员Java零基础视频教程_上部(Java入门,含斯坦福大学练习题+力扣算法题+大厂java面试题)_哔哩哔哩_bilibili
总结:【】表示自己规定范围,\什么什么表示已有的几种规定
接下来是代码练习:
注意:在写正则表达式时要从左向右依次去写。
public class Main {
public static void main(String[] args) {
//验证座机电话号码
//020-2324242 027-42424 0712-3242434
//第一部分 0开头的区号 0就表示是0开头的
//0之后就是2到3位数字 \\d表示是数字{2,3}表示两到三位 -->合起来就是两到三位数字
//第二部分 - ?次数0或1次
//第三部分 号码 第一位不能以0开头,从第二位可以是任意的数字,号码总长度5-10位
String regex = "0\\d{2,3}-?\\d{4,9}";
System.out.println("020-2324242".matches(regex));//true
System.out.println("027-42424".matches(regex));//true
System.out.println("0712-3242434".matches(regex));//true
System.out.println("1777-687699".matches(regex));//false
}
}
在了解了正则表达式做法后,我对正则表达式做法写了注释。
//正则表达式法
reg = "[^号]"; //除了 “号”
String strall1;
strall1 = strall.replaceAll(reg," ");//将除了“号”的全部替换成“ ”
strall1 = strall1.trim();//头尾空格全部删除
String[] strArr = strall1.split("\\s+");//空白字符切割,就得到几个“号”
System.out.println(strArr.length);
strall = strall.replaceAll("号",str1); //将所有“号”替换成str1
System.out.println(strall);
看懂之后突然觉得,也就那样,还不如用数组计数法ὠ0。
7.阳光开朗字符串
题目:
字符串数值解析求和
因为绝大部分计算机都应用于数据处理,所以字符串在程序设计中具有非常重要的地位,许多程序设计语言都增加了对字符串处理的函数或者方法,便于实现对字符串进行统计、排序、解析、截取、反转等操作。
从控制台输入字符串“早餐10.5元,中餐20.2元,晚餐12.9元”,对字符串进行解析获得字符串中的金额,求和并保留2位小数输出。请在Begin-End间补齐代码,完成功能。
可以使用提示方法完成。
提示:正则表达式中,+表示重复1次及以上,*表示重复0次及以上,?表示重复0次或1次
函数提示:
★public static Pattern compile(Stringregex) 功能:模式类的方法,将给定的正则表达式编译为模式,获得一个模式对象
★public Matcher matcher(CharSequenceinput)功能:模式对象的方法,创建一个匹配器/匹配对象,匹配给定的输入与此模式。input为需要分析的输入字符串
练习模板:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String str,reg;
Scanner scan = new Scanner(System.in);
str = scan.next();
/************begin*********/
/***********end***********/
}
}
参考答案:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String str,reg;
Scanner scan = new Scanner(System.in);
str = scan.next();
/************begin*********/
reg = "\\d+.?\\d*"; \\d表示一个数字,+表示一个或多个,这两个合起来表示多少元;. ?表示0个或一个.;\\d*表示0个或多个数字,表示几角几分
Pattern p = Pattern.compile(reg);//创建一个模式对象,将给定的正则表达式编译为模式
Matcher m =p.matcher(str);//模式对象的方法,将str解析为只包含符合正则表达式
double s=0;
while(m.find()){
s = s+Double.parseDouble(m.group());
}
System.out.printf("%.2f",s);
/***********end***********/
}
}
知识点解析:
正则表达式,不懂去看第二题
模式类:
在帮助文档中获得资料表示:
正则表达式的编译表示。
必须首先将正则表达式(指定为字符串)编译为此类的实例。 然后将所得的图案可以被用来创建一个Matcher对象可以匹配任意character sequences针对正则表达式。 执行匹配的所有状态都驻留在匹配器中,所以许多匹配者可以共享相同的模式。
因此,典型的调用序列
Pattern p = Pattern.compile("a*b");//编写实例
Matcher m = p.matcher("aaaaab");//创建matcher对象来匹配"aaaaab"
boolean b = m.matches();//
这个类定义了一个matches方法,以便在正则表达式只使用一次时方便。 该方法编译一个表达式,并在单个调用中匹配输入序列。 该声明
boolean b = Pattern.matches("a*b", "aaaaab");
相当于上面的三个语句,尽管对于重复匹配,它的效率较低,因为它不允许编译的模式被重用。
这个类的实例是不可变的,可以安全地被多个并发线程使用。 该实例Matcher类不适合这样的使用是安全的。
看到这里不懂没关系,因为我也看不懂,接下来可以看看我的大白话。ᾒd
看到这题的时候,我的第一反应是用字符串遍历把数字抠出来然后相加,后来发现在String中不管是数字,点都是以单个的字符存在的,所以把数字抠出来这种简单粗暴的做法显然有些耗费时间。
那么就要采取正则表达式的做法,把字符串里与正则表达式相匹配的一串抠出来,而这种做法Java专门提供了用来进行匹配模式的Pattern类和Matcher类,具体操作方法如下:
得到Pattern对象
使用正则表达式regex作为参数得到一个称为模式的Pattern类的实例pattern.
String regex = "\\d+.?\\d*";
Pattern pattern = Pattern.compile(regex);
得到Matcher对象
Matcher matcher = pattern.matcher(str);
进行了如上两个步骤,就可以用matcher对象来调用各种匹配模式的方法
public boolean find()//寻找str中与regex相匹配的下一子序列,成功返回true,否则返回false.
//每次寻找会从上一次找到的子序列往后查找
public String group()//返回一个String对象,该对象的字符序列是find方法在str中找到的匹配regex的子字符序列
看到这儿再回去看上面的代码,应该就能理解这个是怎么做的了吧。
可能还有一个地方不懂,
Double.parseDouble(m.group());
因为我们抠出来的其实是一个字符串,相加的话需要先把他转化成double 类型。这个就是固定写法,记住就好啦。
同时还有String转int,String转float:
int num4 = Integer.parseInt(str1);
float float1 =Float.parseFloat(str2);
int转String,double转String,float转String:
int i = 10;
double d = 12.34;
float f = 3.2;
String si = Integer.toString(i);
String di = Double.toString(d);
String fi = String.valueOf(f);
8.HashMap集合大法好
题目:
输入示例:
王晓红:24,赵彩:24,王春桃:22
输出示例:
{王晓红=24,赵彩=24,王春桃=22}
练习模板:
public class Main {
public static void main(String[] args) {
/******* Begin *******/
//第一步:接收给定字符串
//第二步:切割花名册
//第三步:创建HashMap集合,key为姓名, value 为年龄
// 第四步:添加数据到集合中
//第五步:打印集合
/******** End *******/
}
}
参考答案:
import java.util.HashMap;
import java.util.Scanner;
import java.util.*;
public class Main {
public static void main(String[] args) {
/******* Begin *******/
//第一步:接收给定字符串
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
//第二步:切割花名册
String[] str = line.split(",");
//第三步:创建HashMap集合,key为姓名, value 为年龄
Map<String,String> map = new HashMap<>();
// 第四步:添加数据到集合中
for(String s:str){
String[] s1 =s.split(":");
map.put(s1[0],s1[1]);
}
//第五步:打印集合
System.out.println(map);
/******** End *******/
}
}
知识点梳理:
这题的知识点其实好少,大致理一下:
字符串操作这个都很简单,自己看吧。
HashMap<K,V>泛型类:
泛型:你可以单纯的理解为他暂时是没有属性的,等着你去规定。
HashMap<K,V>泛型类创建的对象称作散列映射,如:
HashMap<String,Student> hashtable=HashMap<String,Student> ();
其中,hashtable就可以存储“键/值”对数据,其中的键必须是一个String对象,键对应的值必须是Student对象。
hashtable可以调用public V put(K key,V value)将“键/值”对数据存放到散列映射中,该方法同时返回键所对应的值。(K和V是一种类型,看作int之类的)
hashmap的基本解释,hashmap其实就是哈希表,他的数据结构是数组+链表。
HashMap 数据结构为 *数组+链表*,其中:链表的节点存储的是一个 Entry 对象,每个Entry 对象存储四个属性(hash,key,value,next),看不懂的话没关系,看下面这个图
SHAPE \* MERGEFORMAT
![](https://i-blog.csdnimg.cn/blog_migrate/103e58029a61b21c5d9673cb9fd42711.png)
大致了解之后,只需要记住他的常用方法:
put方法:put(key,value),我们经常用存储一些常用的数据,比如flag、百分比之类的,我们就可以返回map结构,如果key相同则值会覆盖,允许key和value为null。
get方法:get(key),主要用来取map中存储的数据,我们根据其key值,可以取到对应的value值,没有该key对应的值则返回null。
remove方法:remove(key),主要用来删除map中对应的key及其value值。
clear方法,用法:clear(),会清空map中的数据。
containsKey(key),判断map集合中是否包含某个key。
containsKey(value),判断map集合中是否包含某个value。
foreach遍历字符串数组
for(String s:str){
System.out.println(s+" ");
}
同样,也可以通过for循环遍历:
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
}
除此之外,还有一种很常用的利用下标索引遍历:
for (int i = 0; i < str.length(); i++) {
System.out.println(str.substring(i, i + 1));
}
但是相比之下,前两种更加实用也更加好理解。
9.喜欢hello的HashSet
题目:
HashSet是为了快速查找而设计的Set,请使用HashSet常用方
法完成以下需求,
* 1.接收给定的一行字符串(如:hello,hi,ask);
* 2.根据英文逗号切割字符串,把切割后的元素加进HashSet;
* 3.判断集合中元素个数,当个数大于4,且集合中没有元素 hello 时,往集合中添加元素hello,
* 如果集合中已有元素 hello,请输出提示语句:“集合中已有该元素”,
* 当个数小于等于 4时,请输出提示语句:“元素个数小于4”;
* 4.打印集合。
练习模板:
/*
* HashSet是为了快速查找而设计的Set,请使用HashSet常用方
法完成以下需求,
* 1.接收给定的一行字符串(如:hello,hi,ask);
* 2.根据英文逗号切割字符串,把切割后的元素加进HashSet;
* 3.判断集合中元素个数,当个数大于4,且集合中没有元素 hello 时,往集合中添加元素hello,
* 如果集合中已有元素 hello,请输出提示语句:“集合中已有该元素”,
* 当个数小于等于 4时,请输出提示语句:“元素个数小于4”;
* 4.打印集合。
**/
import java.util.Scanner;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args){
//第一步:接受给定的字符串
//第二步:切割字符串
//第三步:创建集合
//第四步:将切割后的元素添加进集合
//第五步:判断集合中的元素个数是否大于4
//第六步:当元素个数大于4,且元素中含有hello时,输出指定语
//第七步:当元素个数大于四,且元素中不含hello时,往集合中添加hello
//第八步:当元素个数小于4时,输出指定语
//第九步:打印集合
}
}
参考答案:
/*
* HashSet是为了快速查找而设计的Set,请使用HashSet常用方
法完成以下需求,
* 1.接收给定的一行字符串(如:hello,hi,ask);
* 2.根据英文逗号切割字符串,把切割后的元素加进HashSet;
* 3.判断集合中元素个数,当个数大于4,且集合中没有元素 hello 时,往集合中添加元素hello,
* 如果集合中已有元素 hello,请输出提示语句:“集合中已有该元素”,
* 当个数小于等于 4时,请输出提示语句:“元素个数小于4”;
* 4.打印集合。
**/
import java.util.Scanner;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args){
//第一步:接受给定的字符串
Scanner sc =new Scanner(System.in);
String line = sc.nextLine();
//第二步:切割字符串
String[] str=line.split(",");
//第三步:创建集合
HashSet<String> hs = new HashSet<String>();
//第四步:将切割后的元素添加进集合
for(int i=0;i< str.length;i++){
hs.add(str[i]);
}
//第五步:判断集合中的元素个数是否大于4
if(hs.size()>4) {
//第六步:当元素个数大于4,且元素中含有hello时,输出指定语
if(hs.contains("hello"))
System.out.println("集合中已有该元素");
//第七步:当元素个数大于四,且元素中不含hello时,往集合中添加hello
else hs.add("hello");
}
//第八步:当元素个数小于4时,输出指定语
else{
System.out.println("元素个数小于4");
}
//第九步:打印集合
System.out.println(hs);
}
}
这个也没什么好说的,单纯的记得方法都能做得出来。