通过以下的几个小练习来熟悉和掌握Java常用工具类的一些操作。
说明:请输入一个日期(格式如:xx月xx日xxxx年)
经过处理得到:xxxx年xx月xx日
提示:使用String的方法indexOf、lastIndexOf、substring
import java.util.Scanner;
public class SplitDate {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
System.out.println("请输入日期: (格式如:xx月xx日xxx年)");
String indate = sc.nextLine();
int m = indate.indexOf("月"); //获取"月"的下标值
int d = indate.indexOf("日");
int y = indate.indexOf("年");
String month = indate.substring(0,m); //拆分字符串 从0下标开始到“月“的下标拆分赋值给 month
String day = indate.substring(m+1,d);
String year = indate.substring(d+1,y);
StringBuffer newdate = new StringBuffer(year);
newdate.append("年");
newdate.append(month);
newdate.append("月");
newdate.append(day);
newdate.append("日");
newdate.toString();
System.out.println(newdate);
}
}
请输入日期: (格式如:xx月xx日xxx年)
12月3日1999年
1999年12月3日
想法:把字符串转换成字符数组,用for循环来判断字符和计数。
import java.util.Scanner;
public class CountNum {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请在下面输入一个包含字母和数字的字符串:");
String str = sc.nextLine();
char [] ch = str.toCharArray(); //将此字符串转换为新的字符数组。
int chCount = 0; //字母总数
int nmCount = 0; //数组总数
for(int i = 0 ; i < ch.length ; i++)
{
if (ch[i] >= 'a' && ch[i] <= 'z' || ch[i] >= 'A' && ch[i] <= 'Z')
chCount++;
if (ch[i] >= '0' && ch[i] <='9')
nmCount++;
}
System.out.println("这个字符串中共有 " + chCount+ "个字母和 " +nmCount+ "个数字");
}
}
请在下面输入一个包含字母和数字的字符串:
123456ABCde78
这个字符串中共有 5个字母和 8个数字
“这些年一个人,风也过,雨也走,有过泪,有过错, 还记得坚持甚么,真爱过才会懂,会寂寞会回首,终有梦终有你在心中。
朋友一生一起走,那些日子不再有,一句话,一辈子,一生情,一杯酒。朋友不曾孤单过,一声朋友你会懂,还有伤,还有痛,还要走,还有我。”;
提示:使用String方法indexOf、substring。
方法 1(不完善):(split方法容易有bug,如"朋友在开头或结尾出现两次就会出现计数错误")
java String.split()函数的用法分析
public static void main(String[] args) {
String str = "这些年一个人,风也过,雨也走,有过泪,有过错, 还记得坚持甚么,真爱过才会懂,会寂寞会回首,终有梦终有你在心中。" +
" 朋友一生一起走,那些日子不再有,一句话,一辈子,一生情,一杯酒。朋友不曾孤单过,一声朋友你会懂,还有伤,还有痛,还要走,还有我。";
//split 此方法返回的数组包含此字符串的每个子字符串,该字符串由与给定表达式匹配的另一个子字符串终止,或由字符串结尾终止。
// 数组中的子字符串按照它们在此字符串中的顺序排列。 如果表达式与输入的任何部分不匹配,则生成的数组只有一个元素,即这个字符串。
//例如: 若传参 "这" ,countWord的长度则为1
String[] countWord = str.split("朋友");
System.out.println(countWord.length -1);
for (int i = 0; i < countWord.length; i++)
{
System.out.println(countWord[i]);
}
}
3
这些年一个人,风也过,雨也走,有过泪,有过错, 还记得坚持甚么,真爱过才会懂,会寂寞会回首,终有梦终有你在心中。
一生一起走,那些日子不再有,一句话,一辈子,一生情,一杯酒。
不曾孤单过,一声
你会懂,还有伤,还有痛,还要走,还有我。
方法 1(修改后):
public static void main(String[] args) {
String str = "朋友朋友朋友这些年一个人,风也过,雨也走,有过泪,有过错 "+
"还记得坚持甚么,真爱过才会懂,会寂寞会回首,终有梦终有你在心中"+
"朋友一生一起走,那些日子不再有,一句话,一辈子,一生情,一杯酒。"+
"朋友不曾孤单过,一声朋友你会懂,还有伤,还有痛,还要走,还有我。朋友朋友";
str = "-" +str + "-";
String[] ss = str.split("朋友");
System.out.println(ss.length - 1);
for (String i:ss)
{
System.out.println(i);
}
}
8
-
这些年一个人,风也过,雨也走,有过泪,有过错 还记得坚持甚么,真爱过才会懂,会寂寞会回首,终有梦终有你在心中
一生一起走,那些日子不再有,一句话,一辈子,一生情,一杯酒。
不曾孤单过,一声
你会懂,还有伤,还有痛,还要走,还有我。
-
方法 2:关键字消除后减少的长度除以关键字长度
public static void main(String[] args) {
String str = "朋友朋友这些年一个人,风也过,雨也走,有过泪,有过错\n "+
"还记得坚持甚么,真爱过才会懂,会寂寞会回首,终有梦终有你在心中\n"+
"朋友一生一起走,那些日子不再有,一句话,一辈子,一生情,一杯酒。\n"+
"朋友不曾孤单过,一声朋友你会懂,还有伤,还有痛,还要走,还有我。朋友朋友";
String keyWord = "朋友";
int startLen = str.length();
str = str.replace(keyWord,""); //将关键词消除
System.out.println(str);
int endLen = str.length();
int iCount = (startLen-endLen)/keyWord.length(); //减少的长度除以关键字长度
System.out.println(keyWord+" 一共出现了"+ iCount + "次");
}
这些年一个人,风也过,雨也走,有过泪,有过错
还记得坚持甚么,真爱过才会懂,会寂寞会回首,终有梦终有你在心中
一生一起走,那些日子不再有,一句话,一辈子,一生情,一杯酒。
不曾孤单过,一声你会懂,还有伤,还有痛,还要走,还有我。
朋友 一共出现了7次
说明:在网络程序中,如聊天室、聊天软件等,经常需要对一些用户所提交的聊天内容中的敏感性词语进行过滤。如“性”、“色情”、“爆炸”、“恐怖”、“枪”、“军火”等,这些都不可以在网上进行传播,需要过滤掉或者用其他词语替换掉。
提示:将用户的聊天内容保存到一个字符串对象或一个StringBuilder对象中,然后与敏感词语类表(数组实现)进行比对。如果属于敏感词语,就过滤掉或替换掉。
public static void main(String[] args) {
String [] forbidden = {"性","色情","爆炸","恐怖","枪","军火"}; //敏感词汇
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
for (String s :forbidden)
{
//生成指定长度的*
String nul = ""; //替换敏感词汇
for (int i = 0; i
我喜欢枪械,但是抵制那些色情和性暴力的网站。 //输入
我喜欢*械,但是抵制那些**和*暴力的网站。
说明:固定资产编号=年份+0+产品类型+3位随机数
程序运行流程:请输入年份:
……
请选择产品类型(1. 台式机 2. 笔记本 3. 其他):
……
生成3位随机数
最后显示固定资产编号
提示:3位随机数按如下方法产生: (int)(Math.random()*1000);
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份:");
String year = sc.nextLine();
System.out.println("请输入产品类型:(1.台式机 2.笔记本 3.其他)");
int type = sc.nextInt();
System.out.println("生成固定资产编号为:"+year+ type+ +(int)(Math.random()*1000) );
}
请输入年份:
1999 //输入
请输入产品类型:(1.台式机 2.笔记本 3.其他)
2 //输入
生成固定资产编号为:19992316
public static void main(String[] args) throws ParseException {
Scanner sc = new Scanner(System.in);
System.out.println("请按格式输入第一个日期:(例:1999-7-3)");
String date1 = sc.nextLine();
System.out.println("请输入第二个日期:");
String date2 = sc.nextLine();
//把字符串类型解析为Date类型
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd"); //注意字母大小写
Date d1 = sd.parse(date1); //从字符串中解析文本以产生一个Date
Date d2 = sd.parse(date2);
// long time = 0;
// if (d1.after(d2)) //判断时间先后
// time = d1.getTime() - d2.getTime();
// else
// time = d2.getTime() - d1.getTime();
long time = Math.abs(d2.getTime() - d1.getTime()); //取绝对值
long day = time/1000/60/60/24;
System.out.println("相隔共:" + day + "天");
System.out.println("相隔共:" + day/7 + "周" + day%7 + "天");
}
请按格式输入第一个日期:(例:1999-7-3)
2018-10-05 //输入
请输入第二个日期:
2019-4-10 //输入
相隔共:187天
相隔共:26周5天
想法:可以用System类中的 currentTimeMillis()
import java.util.GregorianCalendar;
public class IsLeapYeay {
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); //获取系统时间
GregorianCalendar years = new GregorianCalendar(); //公历类
for (int i =2000 ;i <= 2100 ; i++)
{
if (years.isLeapYear(i) )
System.out.print(i + " ");
}
long endtTime = System.currentTimeMillis(); //获取系统时间
System.out.println("\n运行时间为:"+(endtTime-startTime)+"毫秒");
}
}
2000 2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044 2048 2052 2056 2060 2064 2068 2072 2076 2080 2084 2088 2092 2096
运行时间为:78毫秒
想法:先把字符串转换成字符数组,再用StringBuffer类中的的append方法来给追加新识别的字符。
public static void main(String[] args) {
String str = "!HELLOworldABCDEFabcdef/*-$g";
char []ch = str.toCharArray(); //字母串转化成字符数组
StringBuffer strb1 = new StringBuffer(); //大写字母
StringBuffer strb2 = new StringBuffer(); //小写祖母
StringBuffer other = new StringBuffer();
for (char c:ch)
{
if (c >= 'a' && c <= 'z')
{
strb1.append(c);
}
else if (c >= 'A' && c <= 'Z')
strb2.append(c);
else
other.append(c);
}
System.out.println("字符串中的大写字母为:"+strb1);
System.out.println("字符串中的小写字母为:"+strb2);
System.out.println("其他字符:"+other);
//大小写字母切换
// for (int i=0;i= 'a' && ch[i] <= 'z')
// ch[i] = (char)(ch[i]-32);
// else if (ch[i] >= 'A' && ch[i] <= 'Z')
// ch[i] = (char)(ch[i]+32);
// System.out.print(ch[i]);
// }
}
字符串中的大写字母为:worldabcdefg
字符串中的小写字母为:HELLOABCDEF
其他字符:!/*-$
// !helloWORLDabcdefABCDEF/*-$G
想法:将输入年份转化为Date格式,然后定义三个变量通过calender.setTime(Date date)方法来设置时间,再用Calendar.get()方法来获得年份,月份,第几天的值。
用代表年份的变量通过GregorianCalendar的isLeapYear(int year)来判断闰年。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;
public class IdDdte {
public static void main(String[] args) throws ParseException {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个日期:(例:1999年1月1日)");
String str =sc.nextLine();
SimpleDateFormat sd = new SimpleDateFormat("yyyy年MM月dd日");
Date indate = sd.parse(str); //将字符串转换成日期
Calendar calendar = Calendar.getInstance(); //使用默认时区和区域设置获取日历。
calendar.setTime(indate);//使用给定的Date设置此Calendar的时间
int year = calendar.get(Calendar.YEAR); //年份
int days_of_month = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); //该月的天数
int day_of_week =calendar.get(Calendar.DAY_OF_WEEK);
if (calendar.get(Calendar.DAY_OF_WEEK) == 1) //1代表周日 7代表周六 2代表周一
day_of_week = 7;
else
day_of_week --;
GregorianCalendar gregorianCalendar = new GregorianCalendar(); //GregorianCalendar 是Calender的子类
if (gregorianCalendar.isLeapYear(year))
System.out.println(year+" 年是闰年");
else
System.out.println(year+" 年是平年");
System.out.println("该年"+ (calendar.get(Calendar.MONTH)+1) +"月有" +days_of_month+"天");
System.out.println("这天是这周的第"+day_of_week+"天");
}
}
请输入一个日期:(例:1999年1月1日)
2019年12月30日 //输入
2019 年是平年
该年12月有31天
这天是这周的第1天