Java 月历的数据结构是什么

Java 月历的数据结构是什么,java,Java,我有一本教科书上的代码来打印日历的月份。它会打印月份第一天之前所有天的空白,但不会打印月份最后一天之后的空白。虽然代码工作正常,但问题是很难用自动化测试它,并且在不破坏它的情况下进行任何更新 我想使这段代码易于测试。我想将日历月移动到类似于表的数据结构中,将打印逻辑移动到单独的方法中。也就是说,将数据和格式分开 除了2d数组或自定义类之外,我还可以使用哪个数据结构/D来表示表?我更喜欢已经包含在Java中的DS,或者来自流行且维护良好的库。理想情况下,DS应该允许我(1)获取日期发生的日期(直接

我有一本教科书上的代码来打印日历的月份。它会打印月份第一天之前所有天的空白,但不会打印月份最后一天之后的空白。虽然代码工作正常,但问题是很难用自动化测试它,并且在不破坏它的情况下进行任何更新

我想使这段代码易于测试。我想将日历月移动到类似于表的数据结构中,将打印逻辑移动到单独的方法中。也就是说,将数据和格式分开

除了2d数组或自定义类之外,我还可以使用哪个数据结构/D来表示表?我更喜欢已经包含在Java中的DS,或者来自流行且维护良好的库。理想情况下,DS应该允许我(1)获取日期发生的日期(直接,而不是通过顺序迭代)和(2)获取任何行并对其进行迭代

我无法从他那里得到答案。我宁愿不使用实用方法创建自己的DS,除非别无选择。请告知

 Mon Tue Wed Thu Fri Sat Sun
                           1
   2   3   4   5   6   7   8
   9  10  11  12  13  14  15
  16  17  18  19  20  21  22
  23  24  25  26  27  28  29
  30  31
守则:

import java.time.DayOfWeek;
import java.time.LocalDate;

//TODO : Add tests.
public class Calendar {
    public static void main(String[] args) {
        printCalendar(3, 2020);
    }

    public static void printCalendar(int month, int year) {
        LocalDate date = LocalDate.of(year, month, 1);

        System.out.println(" Mon Tue Wed Thu Fri Sat Sun");
        DayOfWeek weekday = date.getDayOfWeek();
        int value = weekday.getValue(); // 1 = Monday, ... 7 = Sunday

        for (int i = 1; i < value; i++) {
            System.out.print("    ");
        }

        while (date.getMonthValue() == month) {
            System.out.printf("%4d", date.getDayOfMonth());
            date = date.plusDays(1);
            if (date.getDayOfWeek().getValue() == 1) {
                System.out.println();
            }
        }

        if (date.getDayOfWeek().getValue() != 1) {
            System.out.println();
        }
    }

    //TESTS (for now)
    /*
        1 - Calendar should have exactly 7 columns.
        2 - Header/top row should always be from Mon to Sun.
        3 - 1st & last days of month should be in correct place.
        4 - All days before 1st day of month should be empty.
    */

}
import java.time.DayOfWeek;
导入java.time.LocalDate;
//TODO:添加测试。
公课日历{
公共静态void main(字符串[]args){
印刷日历(2020年3月);
}
公共静态无效打印日历(整数月,整数年){
LocalDate=LocalDate.of(年、月、1);
System.out.println(“周一周二周三周四周五周六周日”);
DayOfWeek weekday=date.getDayOfWeek();
int value=weekday.getValue();//1=Monday,…7=Sunday
for(int i=1;i
我忘了使用
java.time
类进行渲染

试着这样做:

参加
课程:

class Day {
    int number;
    String render() {
        return number == 0 ? "    " : String.format("%4d", number);
    }
}
class Week {
    List<Day> days;
    String render() {
        return days.stream().map(Day::render).collect(Collectors.joining(""));
    }
}
class Month {
    List<Week> weeks;
    String render() {
        return weeks.stream().map(Day::render).collect(
            Collectors.joining("\n", " Mon Tue Wed Thu Fri Sat Sun", "\n")
        );
    }
}
课程:

class Day {
    int number;
    String render() {
        return number == 0 ? "    " : String.format("%4d", number);
    }
}
class Week {
    List<Day> days;
    String render() {
        return days.stream().map(Day::render).collect(Collectors.joining(""));
    }
}
class Month {
    List<Week> weeks;
    String render() {
        return weeks.stream().map(Day::render).collect(
            Collectors.joining("\n", " Mon Tue Wed Thu Fri Sat Sun", "\n")
        );
    }
}
对于“空白”日,不要给指定号码。把你的日子积攒成几周,把几周积攒成一个月,然后:

System.out.println(month.render());

那么31个元素的数组呢?它非常具体,几乎肯定不存在。