天天看點

PTA乙級1028

1028

某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。

這裡確定每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過 200 歲的老人,而今天是 2014 年 9 月 6 日,是以超過 200 歲的生日和未出生的生日都是不合理的,應該被過濾掉。

輸入格式:

輸入在第一行給出正整數 N,取值在(0,10^

​5

​​ ];随後 N 行,每行給出 1 個人的姓名(由不超過 5 個英文字母組成的字元串)、以及按 yyyy/mm/dd(即年/月/日)格式給出的生日。題目保證最年長和最年輕的人沒有并列。

輸出格式:

在一行中順序輸出有效生日的個數、最年長人和最年輕人的姓名,其間以空格分隔。

輸入樣例:

5

John 2001/05/12

Tom 1814/09/06

Ann 2121/01/30

James 1814/09/05

Steve 1967/11/20

輸出樣例:

3 Tom John

思路:一開始我是想同時用空格和斜杠将姓名年月日分開,然後單獨比較年月日,這樣寫有點複雜代碼臃腫,後來通過了解他人的代碼了解到java中的Date類

  • 首先使用java中的SimpleDateFormat類用來對日期字元串進行解析和格式化輸出

    private final static DateFormat df = new SimpleDateFormat("yyyy/MM/dd");

  • 然後在建立人的類中建立人的對象以及比較人生日是否符合實際的方法

    比較用了

public int compareTo(Person p) {  
            return this.brithday.compareTo(p.brithday);
        }
           
  • 然後在主函數中通過前面的SimpleDateFormat類建立最大日期和最小日期限制

Date max = df.parse(“2014/09/06”);//最晚出生時間

Date min = df.parse(“1814/09/06”);//最早出生時間

  • 通過for循環,将每次輸入的資料以空格劃分位姓名和生日,然後通過比較方法得出符合條件的人并存入list中。
for (int i = 0; i < n; i++) {
            String[] people = br.readLine().split(" ");//以空格劃分輸入的資料
            String name = people[0];//姓名
            Date date = df.parse(people[1]);//日期
            if (date.compareTo(max) <= 0 && date.compareTo(min) >= 0) {//比較日期判斷是否在要求的區間内
                list.add(new Person(name, date));
            }
        }
           
  • 最後判斷這個list,用使用Collections工具類的sort靜态方法對list進行排序

    最終得出符合條件的人數和年最大和最年輕的人的姓名并輸出

完整代碼:

package test1;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

public class PTA1028 {
    //使用java中的SimpleDateFormat類用來對日期字元串進行解析和格式化輸出
    private final static DateFormat df = new SimpleDateFormat("yyyy/MM/dd");

    //
    static class Person implements Comparable<Person> {
        String name;
        private Date brithday;

        Person(String name, Date birthday) {
            this.name = name;
            this.brithday = birthday;
        }

        @Override
        public int compareTo(Person p) {
            return this.brithday.compareTo(p.brithday);//比較兩個日期
        }
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //parse
        //public Date parse(String texts)
        //解析字元串的文本,生成 Date。
        //此方法試圖解析文本。如果解析成功,并傳回解析得到的日期。
        Date max = df.parse("2014/09/06");//最晚出生時間
        Date min = df.parse("1814/09/06");//最早出生時間
        int n = Integer.parseInt(br.readLine());//讀取輸入的人數
        List<Person> list = new ArrayList<Person>();
        for (int i = 0; i < n; i++) {
            String[] people = br.readLine().split(" ");//以空格劃分輸入的資料
            String name = people[0];//姓名
            Date date = df.parse(people[1]);//日期
            if (date.compareTo(max) <= 0 && date.compareTo(min) >= 0) {//比較日期判斷是否在要求的區間内
                list.add(new Person(name, date));
            }
        }
        if (list.size() > 0) {
            Collections.sort(list);//使用Collections工具類的sort靜态方法對list進行排序
            System.out.print(list.size() + " " + list.get(0).name + " "
                    + list.get(list.size() - 1).name);
        } else {
            System.out.println(0);
        }
    }
}
           

運作結果:

5

john 2011/4/10

Tom 1814/9/5

Ann 2000/5/8

James 1967/10/20

Steve 2018/10/10

3 James john