Java日历横向输出

Java日历横向输出

用了三种方法,第一种是将日历打印出来拼接为字符串,在用字符串操作方法对结果进行操作,比较杂乱,面向过程;第二种是将每个月保存在一个类里,在对这个类进行操作,面向对象,比较简洁,但是对类的操作是面向过程的;第三种是纯粹的面向对象,用了单例模式,个人能力有限,写的比较繁琐:

方法一:

package com.yhan219.demo;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;

public class Main {

    /**
     * 
     * @param startYear
     * @param startMonth
     * @param startDay
     * @param endYear
     * @param endMonth
     * @param endDay
     * @param num:每行显示的日历个数
     * 算法主要思想:输入两个日期,将两个日期之间的日期按照正常日历格式,一个月一个月的输出,存入一个字符串中,将字符串分割为n(
     *           两个日期之间的月数)个字符数组中,再将每个字符数组按行分割,将分割得到的结果存入一个二维数组中即可。
     */
    public static void outprint(int startYear, int startMonth, int startDay, int endYear, int endMonth, int endDay,
            int num) {
        Calendar start = new GregorianCalendar(startYear, startMonth - 1, startDay);// 月份从0开始,按照习惯,应减1
        Calendar end = new GregorianCalendar(endYear, endMonth - 1, endDay);
        if(start.compareTo(end) > 0){
            System.err.println("后面的日期必须大于前面的日期!");
            return;
        }
        int startWeekDay = start.get(Calendar.DAY_OF_WEEK);// 开始日是星期几
        int index = 0;// 索引位置,用以判断是不是周六,周六需换行
        int thisMonth = startMonth;// 记录第几月
        StringBuffer sb = new StringBuffer();
        sb.append(startYear + "年" + thisMonth + "月\t\t\t\t\t\t\n日\t一\t二\t三\t四\t五\t六\t\n");
        for (int i = 0; i < startWeekDay - 1; i++) {// 边界处理,最开始空多少空格
            sb.append("\t");
        }
        while (start.compareTo(end) <= 0) {// 包含末尾那天
            sb.append(start.get(Calendar.DATE) + "\t");
            if ((index++ + startWeekDay) % 7 == 0) {// 周六换行,索引增1
                sb.append("\n");
            }
            start.add(Calendar.DAY_OF_MONTH, 1);// 日期加1
            if (start.get(Calendar.DATE) == 1 && start.compareTo(end) <= 0) {// 跨月处理
                if (thisMonth == 12) {// 跨年处理
                    thisMonth = 0;
                    startYear++;
                }
                for (int i = 0; i < 8 - start.get(Calendar.DAY_OF_WEEK); i++) {// 每月月末后面添加的空格数
                    sb.append("\t");
                }
                sb.append("\n\n" + startYear + "年" + ++thisMonth + "月\t\t\t\t\t\t\n日\t一\t二\t三\t四\t五\t六\t\n");
                for (int j = 0; j < start.get(Calendar.DAY_OF_WEEK) - 1; j++) {// 每月结束换行后第二月开始要空的天数
                    sb.append("\t");
                }
            }
        }
        String[] arr = sb.toString().split("\n\n");// 将获取的日历切割,一个月为一个单位
        String[][] array = new String[arr.length][8];// 保存结果
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < 8; j++) {
                array[i][j] = "\t\t\t\t\t\t\t";// 初始化结果数组,每行7个空格
            }
        }
        for (int i = 0; i < arr.length; i++) {
            String[] a = arr[i].split("\n");// 每个月的日历按行切割
            for (int j = 0; j < a.length; j++) {
                array[i][j] = a[j];// 将每行结果存入结果,其中i标示第几个数组(月),j表示第几行
            }
        }
        for (int i = 0; i < array.length; i += num) {
            for (int j = 0; j < array[i].length; j++) {
                for (int k = 0; k < num && i + k < array.length; k++) {// 每行显示多个日历
                    System.out.print(array[i + k][j] + "\t");// 每行每个日历之间用空格隔开
                }
                System.out.println();// 每行显示结束换行
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        System.out.println("请输入两个日期和每行显示的日历个数(示例:2016 6 1 2017 2 1 3):");
        Scanner scanner=new Scanner(System.in);
        String in = scanner.nextLine();
        try{
            String [] inArr=in.split(" ");
            int startYear=Integer.parseInt(inArr[0]);
            int startMonth=Integer.parseInt(inArr[1]);
            int startDay=Integer.parseInt(inArr[2]);
            int endYear=Integer.parseInt(inArr[3]);
            int endMonth=Integer.parseInt(inArr[4]);
            int endDay=Integer.parseInt(inArr[5]);
            int num=Integer.parseInt(inArr[6]);
            outprint(startYear, startMonth, startDay, endYear, endMonth, endDay, num);
        }catch(Exception e){
            System.err.println("输入格式错误!");
        }finally {
            scanner.close();
        }

    }

}

方法二:

封装的MyMonth记录每月信息:

package com.yhan219.demo.javabase;

public class MyMonth {
    private int year;
    private int month;
    private int [][] weeks=new int[6][7];//用一个二维数组按周保存日期,每个月最多跨域6周(行),每周7天(列)

    public MyMonth() {
        super();
        // TODO Auto-generated constructor stub
    }

    public MyMonth(int year, int month) {
        super();
        this.year = year;
        this.month = month;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int[][] getWeeks() {
        return weeks;
    }

    public void setWeeks(int[][] weeks) {
        this.weeks = weeks;
    }
}

类操作

package com.yhan219.demo.javabase;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

public class Main {

    public MyMonth getMyMonth(int year,int month){//将每月填充入二维数组
        MyMonth myMonth=new MyMonth(year,month);
        Calendar start=new GregorianCalendar(year,month-1,1);//月初
        Calendar end=new GregorianCalendar(year,month,1);//月末
        int [][] weeks=new int [6][7];
        for(int i=0;i<6; i++){
            for(int j=start.get(Calendar.DAY_OF_WEEK)-1;j<7 && start.compareTo(end)<0;j++){
                weeks[i][j]=start.get(Calendar.DATE);
                start.add(Calendar.DAY_OF_MONTH, 1);
            }
        }
        myMonth.setWeeks(weeks);
        return myMonth;
    }

    public List<MyMonth> getList(int startYear,int startMonth,int endYear,int endMonth){
        List<MyMonth> monthList=new ArrayList<MyMonth>();
        Calendar start = new GregorianCalendar(startYear, startMonth - 1, 1);// 月份从0开始,按照习惯,应减1
        Calendar end = new GregorianCalendar(endYear, endMonth, 1);
        while(start.compareTo(end)<0){
            MyMonth m=getMyMonth(start.get(Calendar.YEAR),start.get(Calendar.MONTH)+1);
            monthList.add(m);//将每个月加入list
            start.add(Calendar.MONTH, 1);//下一个月
        }
        return monthList;
    }

    public void printMonth(int startYear,int startMonth,int endYear,int endMonth,int num){
        List<MyMonth> list=getList(startYear, startMonth, endYear, endMonth);
        int size=list.size();
        for(int i=0;i<size;i+=num){
            for(int j=0;j<num&&j<size-i;j++){//输出当前年月
                MyMonth mm=list.get(i+j);
                System.out.print(mm.getYear()+"年"+mm.getMonth()+"月\t\t\t\t\t\t\t");
            }
            System.out.println();
            for(int j=0;j<num&&j<size-i;j++){
                System.out.print("日\t一\t二\t三\t四\t五\t六\t\t");
            }
            System.out.println();
            for(int row=0;row<6;row++){
                for(int k=0;k<num && i+k<list.size();k++){
                    MyMonth m=list.get(k);
                    for(int col=0;col<7;col++){
                        int d=m.getWeeks()[row][col];
                        System.out.print(d==0?"\t":d+"\t");//数组中为0的数显示为制表符,否则显示数组内容
                        if(col==6){//相邻两个月之间多添加一个制表符,使输出结果更明朗
                            System.out.print("\t");
                        }
                    }
                }
                System.out.println();
            }
            System.out.println();
        }

    }

    public static void main(String args[]){
        Main main=new Main();
        main.printMonth(2016, 6, 2016, 7, 3);
    }
}

方法三

package com.yhan219.demo1;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Month {
    private int year;
    private int month;

    public Month(int year, int month) {
        super();
        this.year = year;
        this.month = month;
    }

    public String getLine(int line){
        StringBuffer sb=new StringBuffer();
        Calendar calendar=new GregorianCalendar(this.year,this.month-1,1);
        if(this.month==0){
            sb.append(this.year-1+"年"+12+"月\t\t\t\t\t\t\n");
        }else{
            sb.append(this.year+"年"+this.month+"月\t\t\t\t\t\t\n");
        }

        sb.append("日\t一\t二\t三\t四\t五\t六\t\n");
        int start=calendar.get(Calendar.DAY_OF_WEEK);
        int weekNum=calendar.getMaximum(Calendar.WEEK_OF_MONTH);
        int index=start-1;
        for(int j=0;j<start-1;j++){
            sb.append("\t");
        }
        for(int i=0;i<weekNum;i++){
            for(int j=0;j<7-index;j++){
                int today=calendar.get(Calendar.DATE);
                sb.append(today+"\t");
                if(calendar.get(Calendar.DATE)==calendar.getActualMaximum(Calendar.DAY_OF_MONTH)){
                    int n=calendar.get(Calendar.DAY_OF_WEEK);
                    if( calendar.get(Calendar.DAY_OF_WEEK)!=7){//如果月末刚好是周六,则不空
                        for(int k=0;k<7-n;k++){
                            sb.append("\t");//月末空格
                        }
                    }

                    for(int k=0;k<7-weekNum;k++){
                        sb.append("\n\t\t\t\t\t\t\t");//空行
                    }
                    break;
                }
                calendar.add(Calendar.DAY_OF_MONTH, 1);
            }
            sb.append("\n");
            index=0;
        }
        String [] str=sb.toString().split("\n");
        return str[line];
    }

}
package com.yhan219.demo1;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

public class LineMonth {

    private List<Month> months=new ArrayList<>();

    public String getLine(int i){
        StringBuffer ret= new StringBuffer();
        for (Month month : months) {
            ret.append(month.getLine(i)+"\t");
        }
        return ret.toString();

    }

    public void setMonths(int startYear,int startMonth,int endYear,int endMonth){
        Month month;
        months.clear();
        Calendar start=new GregorianCalendar(startYear,startMonth,1);
        Calendar end=new GregorianCalendar(endYear,endMonth,1);
        while(start.compareTo(end)<=0){
            month=new Month(start.get(Calendar.YEAR),start.get(Calendar.MONTH));
            this.months.add(month);
            start.add(Calendar.MONTH, 1);
        }
    }

}
package com.yhan219.demo1;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

public class MyCalander {

    private static MyCalander myCalander=null;

    private List<LineMonth> lineMonths=new ArrayList<>(); 

    public  String formart(){
        StringBuffer ret = new StringBuffer();
        // 构造lineMonth的集合
        for (LineMonth lineMonth : lineMonths) {
            for(int i=0;i<8;i++){
                ret.append(lineMonth.getLine(i)+"\n");
            }
            ret.append("\n");
        }
        return ret.toString();
    }


    private MyCalander(){}

    public static MyCalander getInit(int startYear,int startMonth,int endYear,int endMonth,int num){

        /*MyCalander calander = new MyCalander();*/
        if(myCalander==null){
            myCalander=new MyCalander();
        }
        myCalander.init(startYear,startMonth, endYear,endMonth, num);
        return myCalander;
    }

    public void init(int startYear,int startMonth,int endYear,int endMonth,int num){
        // 构造lineMonths
        LineMonth lineMonth=null;
        Calendar start=new GregorianCalendar(startYear,startMonth,1);
        Calendar end=new GregorianCalendar(endYear, endMonth, 1);
        int monthNum=0;
        if(startYear==endYear){
            monthNum=endMonth-startMonth+1;
        }else{
            monthNum=12*(endYear-startYear)-startMonth+endMonth+1;//跨年处理
        }
        int index=0;
        while(start.compareTo(end)<=0 && index<(monthNum-monthNum%num)){
            lineMonth=new LineMonth();
            int startY=start.get(Calendar.YEAR);
            int startM=start.get(Calendar.MONTH);
            int show=startM+num-1;
            lineMonth.setMonths(startY, startM, startY,show);
            lineMonths.add(lineMonth);
            start.add(Calendar.MONTH, num);
            index+=num;
        }
        if(index==(monthNum-monthNum%num)){//最后一行处理
            lineMonth=new LineMonth();
            lineMonth.setMonths(start.get(Calendar.YEAR), start.get(Calendar.MONTH), start.get(Calendar.YEAR), endMonth);
            lineMonths.add(lineMonth);
        }
    }

}
package com.yhan219.demo1;

import java.util.Scanner;

public class InputUtil {
    public static int [] input(){
        System.out.println("请输入两个日期和每行显示的日历个数(示例:2016 6 2017 2 3):");
        Scanner scanner=new Scanner(System.in);
        String in = scanner.nextLine();
        try{
            String [] inArr=in.split(" ");
            int [] input=new int[5];
            for(int i=0;i<5;i++){
                input[i]=Integer.parseInt(inArr[i]);
            }
            if(input[0]>input[2]||(input[0]==input[2])&&input[1]>input[3]||input[4]<=0){
                System.err.println("输入格式错误!");
                System.exit(0);
            }else{
                return input;
            }
        }catch(Exception e){
            System.err.println("输入格式错误!");
        }finally {
            scanner.close();
        }
        return null;
    }


}
package com.yhan219.demo1;

public class App {

    public static void main(String[] args) {
        //输入
        int [] input= InputUtil.input();
        // 格式化
        String formatStr =  MyCalander.getInit(input[0], input[1],input[2],input[3],input[4]).formart();
        //输出
        System.out.println(formatStr);
    }

}

结果截图如下,第一种设置了年月日,后面两种都是只设置了年月。

这里写图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值