流星也为你落下


私信TA

用户名:dotcpp0796798

访问量:31

签 名:

我会意气风发

等  级
排  名 5938
经  验 1459
参赛次数 0
文章发表 12
年  龄 20
在职情况 学生
学  校 江西理工大学
专  业 软件工程

  自我简介:

解题思路:

        为了解决这个问题,我们需要根据输入的日期格式 "AA/BB/CC" 判断所有可能的日期,并将其输出为 "yyyy-MM-dd" 格式。

        我们需要考虑以下几点:

             1. **年份的解析**:   - 对于年份 "AA",如果 AA >= 60,则视为 19AA;如果 AA < 60,则视为 20AA。

             2. **日期的解析**:   - 输入的日期可以有三种解释方式:     - 年/日/月     - 月/日/年     - 日/月/年 

             3. **日期的有效性**:   - 需要确保生成的日期在1960年到2059年之间,并且日期是有效的。
注意事项:    

                1.**日期格式化**:将合法日期格式化为 "yyyy-MM-dd" 并存入集合中以去重。 

                2. **输出结果**:将集合中的日期按升序排序并输出。

                3.注意输出格式要求,同时 一定一定一定要记得去重!!!
参考代码:

import java.util.*;


public class Main {

public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);


        List<myDate> myDateList = new ArrayList<>();


        //先将输入的字符串划分成三小块

        String[] split = scanner.next().split("/");

        //再将其分别转换成对应的数字

        int[] date = new int[3];

        for (int i = 0; i < split.length; i++) {

            date[i] = Integer.parseInt(split[i]);

        }


        //第一种:判断年在开头的情况

        if (yearAtHead(date)) {

            //先放入myDate类中,等排好序在输出

            myDate myDate = new myDate(date[0], date[1], date[2]);

            myDateList.add(myDate);

        }

        //第二种:判断年在末尾的情况

        if (DayMonthYear(date)) myDateList.add(new myDate(date[2], date[1], date[0]));

        if (monthDayYear(date)) myDateList.add(new myDate(date[2], date[0], date[1]));


        //三种情况都不满足

        if (myDateList.isEmpty()) return;

        //最后对所有情况进行排序

        else if (myDateList.size() == 1) System.out.println(myDateList.get(0).toString());    //一个的话就不需要排序了

        else {

            //多个的话:先进行去重处理

            for (int i = 0; i < myDateList.size(); i++) {

                for (int j = i + 1; j < myDateList.size(); j++) {

                    if (myDateList.get(i).equals(myDateList.get(j))){

                        myDateList.remove(myDateList.get(j));

                        j--;    //防止漏掉对象没比

                    }

                }

            }

            //排序(匿名内部类)

            myDateList.sort(new Comparator<myDate>() {

                @Override

                public int compare(myDate o1, myDate o2) {

                    //年月日的顺序一次判断

                    if (o1.getYear() != o2.getYear()) return o1.getYear() - o2.getYear();

                    else {

                        if (o1.getMonth() != o2.getMonth()) return o1.getMonth() - o2.getMonth();

                        else return o1.getDay() - o2.getDay();

                    }

                }

            });


            //排好序后进行迭代

            for (int i = 0; i < myDateList.size(); i++) {

                System.out.println(myDateList.get(i).toString());

            }

        }


    }


    //判断年在开头的情况 —— 年/月/日

    public static boolean yearAtHead(int[] date) {

        if (date[0] < 0 || date[0] > 99) return false;

        //判断月份——合法范围

        if (date[1] >= 1 && date[1] <= 12) {

            //二月

            if (date[1] == 2 && isRunNian(date[0])) {

                //二月的闰年

                if (date[2] >= 1 && date[2] <= 29) return true;

                else return false;

            }

            //平年的二月

            if (date[1] == 2 && !isRunNian(date[0])) {

                if (date[2] >= 1 && date[2] <= 28) return true;

                else return false;

            }


            //1,3,5,7,8,10,12月

            if (date[1] == 1 || date[1] == 3 || date[1] == 5 || date[1] == 7 || date[1] == 8 || date[1] == 10 || date[1] == 12) {

                if (date[2] <= 31 && date[2] >= 1) return true;

                else return false;

            }

            //4,6,9,11月

            if (date[1] == 4 || date[1] == 6 || date[1] == 9 || date[1] == 11) {

                if (date[2] <= 30 && date[2] >= 1) return true;

                else return false;

            }


        }

        //月份不合法,不满足要求

        return false;

    }


    //第二种情况:年在末尾:日月年

    public static boolean DayMonthYear(int[] date) {

        if (date[2] < 0 || date[2] >= 100) return false;


        //判断月份

        if (date[1] >= 1 && date[1] <= 12) {

            //二月

            if (date[1] == 2 && isRunNian(date[2])) {

                //闰年二月

                if (date[0] >= 1 && date[0] <= 29) return true;

                else return false;

            }

            if (date[1] == 2 && !isRunNian(date[2])) {

                //平年二月

                if (date[0] >= 1 && date[0] <= 28) return true;

                else return false;

            }

            //1,3,5,7,8,10,12

            if (date[1] == 1 || date[1] == 3 || date[1] == 5 || date[1] == 7 || date[1] == 8 || date[1] == 10 || date[1] == 12) {

                if (date[0] >= 1 && date[0] <= 31) return true;

                else return false;

            }

            //4,6,9,11

            if (date[1] == 4 || date[1] == 6 || date[1] == 9 || date[1] == 11) {

                if (date[0] >= 1 && date[0] <= 30) return true;

                else return false;

            }

        }

        return false;

    }



    //第三种情况:月日年

    public static boolean monthDayYear(int[] date) {

        if (date[2] < 0 || date[2] > 99) return false;

        //判断月份

        if (date[0] <= 12 && date[0] >= 1) {

            //二月

            if (date[0] == 2 && isRunNian(date[2])) {

                //闰年二月

                if (date[1] >= 1 && date[1] <= 29) return true;

                else return false;

            }

                //平年二月

            if (date[0] == 2 && !isRunNian(date[2])) {

                if (date[1] >= 1 && date[1] <= 28) return true;

                else return false;

            }

            //1,3,5,7,8,10,12

            if (date[0] == 1 || date[0] == 3 || date[0] == 5 || date[0] == 7 || date[0] == 8 || date[0] == 10 || date[0] == 12) {

                if (date[1] >= 1 && date[1] <= 31) return true;

                else return false;

            }

            //4,6,9,11

            if (date[0] == 4 || date[0] == 6 || date[0] == 9 || date[0] == 11){

                if (date[1] >= 1 && date[1] <= 30) return true;

                else return false;

            }

        }

        return false;

    }



    //辅助函数:判断是否为闰年

    public static boolean isRunNian(int year) {

        if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) return true;

        else return false;

    }

}



class myDate {

    private int year;

    private int month;

    private int day;


    public myDate() {

    }


    public myDate(int year, int month, int day) {

        this.year = year;

        this.month = month;

        this.day = day;

    }


    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 getDay() {

        return day;

    }


    public void setDay(int day) {

        this.day = day;

    }


    //重写toString()方法

    @Override

    public String toString() {

        //这里主要是为了方便输出

        String newYear = "" + year;

        if (year >= 0 && year <= 9) newYear = "200" + year;

        if (year >= 60 && year <= 99) newYear = "19" + year;

        if (year >= 10 && year <= 59) newYear = "20" + year;

        String newMonth = "" + month;

        String newDay = "" + day;

        //满足条件:输出

        if (month >= 1 && month <= 9) newMonth = "0" + month;

        if (day >= 1 && day <= 9) newDay = "0" + day;


        return newYear + "-" + newMonth + "-" + newDay;

    }


    //重写equals()方法  —— 去重


    @Override

    public boolean equals(Object obj) {

        if (obj == null) return false;

        if (this == obj) return true;

        //内存地址不同

        if (!(obj instanceof myDate)) return false; //不是myDate类型,没必要转


        myDate date = (myDate) obj;

        return this.year == date.year && this.month == date.month && this.day == date.day;

    }

}


 

0.0分

1 人评分

  评论区

  • «
  • »