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