Java常用类练习01

版权声明:本文为博主原创文章,如需转载请先联系作者后注明出处 https://blog.csdn.net/weixin_42158633/article/details/89161248

通过以下的几个小练习来熟悉和掌握Java常用工具类的一些操作。

1. 请根据控制台输入的特定日期格式拆分日期

说明:请输入一个日期(格式如: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日

2. 给出一个随机字符串,判断有多少字母?多少数字?

想法:把字符串转换成字符数组,用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个数字

3. 以下是一段歌词,请从这段歌词中统计出朋友出现的次数。

“这些年一个人,风也过,雨也走,有过泪,有过错, 还记得坚持甚么,真爱过才会懂,会寂寞会回首,终有梦终有你在心中。
朋友一生一起走,那些日子不再有,一句话,一辈子,一生情,一杯酒。朋友不曾孤单过,一声朋友你会懂,还有伤,还有痛,还要走,还有我。”;

提示:使用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次

4. 编写敏感词过滤程序

说明:在网络程序中,如聊天室、聊天软件等,经常需要对一些用户所提交的聊天内容中的敏感性词语进行过滤。如“性”、“色情”、“爆炸”、“恐怖”、“枪”、“军火”等,这些都不可以在网上进行传播,需要过滤掉或者用其他词语替换掉。

提示:将用户的聊天内容保存到一个字符串对象或一个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 <s.length(); i++)
            nul += "*";


        if (str.contains(s))               // boolean contains 方法 当且仅当此字符串包含指定的char值序列时才返回true。
            str = str.replace(s,nul);     //replace(char oldChar,char newChar) 返回从替换所有出现字符串

    }
    System.out.println(str);

}
运行结果:
我喜欢枪械,但是抵制那些色情和性暴力的网站。 //输入
我喜欢*械,但是抵制那些**和*暴力的网站。

5. 根据输入的年份、产品类型和随机数产生固定资产编号


说明:固定资产编号=年份+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

6. 计算某年、某月、某日和某年、某月、某日之间的天数间隔和周数。


答案代码:
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天

7. 计算并输出21世纪的闰年,计算程序的执行时间。

想法:可以用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毫秒

8. 编写一个程序,设定一个有大小写字母的字符串,先将字符串的大写字符输出,再将字符串中的小写字符输出。

想法:先把字符串转换成字符数组,再用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<ch.length;i++)
//        {
//            if (ch[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

9. 编写程序,(Scanner)当以年-月-日的格式输入一个日期时,输出其该年是否为闰年,该月有几天,该日是星期几

想法:将输入年份转化为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天

猜你喜欢

转载自blog.csdn.net/weixin_42158633/article/details/89161248