IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 01 排序【PAT A1095】Cars on Campus -> 正文阅读

[Java知识库]01 排序【PAT A1095】Cars on Campus

1 题目

在这里插入图片描述

2 代码

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

public class A1095 {

    public static final DateFormat df = new SimpleDateFormat("HH:mm:ss");

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");

        int N = Integer.parseInt(input[0]);
        int K = Integer.parseInt(input[1]);

        ArrayList<Car> totalCar = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            String[] line = br.readLine().split(" ");
            totalCar.add(new Car(line[0], df.parse(line[1]), line[2]));
        }

        Collections.sort(totalCar, new Comparator<Car>() {
            @Override
            public int compare(Car o1, Car o2) {
                if (!(o1.id.equals(o2.id)))
                    return o1.id.compareTo(o2.id);
                else
                    return o1.time.compareTo(o2.time);
            }
        });

        ArrayList<Car> validCar = new ArrayList<>();  // 保存有效时间的车辆信息
        Map<String, Long> packTime = new HashMap<>();  // 保存车牌号和停留时间的对应关系
        long maxTime = -1L;  // 保存最长的车辆停留时间,单位是秒
        for (int i = 0; i < totalCar.size() - 1; i++) {
            if (totalCar.get(i).id.equals(totalCar.get(i + 1).id) && totalCar.get(i).state.equals("in") && totalCar.get(i + 1).state.equals("out")) {
                validCar.add(totalCar.get(i));
                validCar.add(totalCar.get(i + 1));

                long time = (totalCar.get(i + 1).time.getTime() - totalCar.get(i).time.getTime()) / 1000;
                if (!packTime.containsKey(totalCar.get(i).id))
                    packTime.put(totalCar.get(i).id, 0L);  // 一开始是没有停留时间

                packTime.put(totalCar.get(i).id, packTime.get(totalCar.get(i).id) + time);  // 增加车辆的停留时间
                maxTime = Math.max(packTime.get(totalCar.get(i).id), maxTime);
            }
        }

        //  将车辆按照时间进行排序
        Collections.sort(validCar, new Comparator<Car>() {
            @Override
            public int compare(Car o1, Car o2) {
                return o1.time.compareTo(o2.time);
            }
        });

        Date now = null;  // 记录查询的时间
        int num = 0;  // 遍历有效车辆数组的下标变数
        int numberCar = 0;  // 记录在now时的车辆数量
        int[] t = new int[K];
        for (int i = 0; i < K; i++) {
            String str = br.readLine();
            now = df.parse(str);

            while (num < validCar.size() && now.compareTo(validCar.get(num).time) >= 0) {
                if (validCar.get(num).state.equals("in"))
                    numberCar++;
                else
                    numberCar--;
                num++;
            }
            t[i] = numberCar;  // 记录所有时间的停留车辆个数
        }

        // 遍历出停留时间最长的车牌号
        ArrayList<String> str = new ArrayList<>();
        Iterator<Map.Entry<String, Long>> entryIterator = packTime.entrySet().iterator();
        while (entryIterator.hasNext()) {
            Map.Entry<String, Long> next = entryIterator.next();
            if (next.getValue().equals(maxTime))
                str.add(next.getKey());
        }

        Collections.sort(str, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });


        for (int i = 0; i < t.length; i++) {
            System.out.println(t[i]);
        }
        for (int i = 0; i < str.size(); i++) {
            System.out.print(str.get(i) + " ");
        }
        System.out.println(String.format("%02d", maxTime / 3600) + ":" + String.format("%02d", maxTime % 3600 / 60) + ":" + String.format("%02d", maxTime % 60));
    }
}

class Car {
    String id;
    Date time;
    String state;

    public Car(String id, Date time, String state) {
        this.id = id;
        this.time = time;
        this.state = state;
    }

    @Override
    public String toString() {
        return "Car{" +
                "id='" + id + '\'' +
                ", time=" + time +
                ", state='" + state + '\'' +
                '}';
    }
}

在这里插入图片描述

3 要点

(1)思路:①读入所有车辆信息到totalList后,按照车牌号、时间对所有车辆进行排序,然后遍历整个totalList,将其中无效的时间信息剔除,有效的保留在validList中,并在遍历的过程中保存所有的车辆停放时间信息到map中。②然后,按照时间对validList进行排序,便于后续的车辆信息计算。依次读入需要查询的时间,遍历validList,如果validList中元素时间小于查询的时间,并且状态status为in,那么当前时间的停放车辆+1,反之,状态status为out,那么当前时间的停放车辆-1;并使用一个数量数组保存每个时间段的数量。③从map中寻找出停留时间最长的车辆信息到strList,并排序。
④按规则依次输出数量数组、strList和最长停放时间。
(2)坑点:①如果每读入一个时间信息且立即输出当前停放车辆信息,会导致输出的格式错误,需要多打一个回车控制。如下:

        for (int i = 0; i < K; i++) {
            String str = br.readLine();
            now = df.parse(str);

            while (num < validCar.size() && now.compareTo(validCar.get(num).time) >= 0) {
                if (validCar.get(num).state.equals("in"))
                    numberCar++;
                else
                    numberCar--;
                num++;
            }
            System.out.println(numberCar);  // 记录所有时间的停留车辆个数
        }

②:map中使用包装类Long型数据时,利用==进行比较数据大小已经失效,需要使用Long.equals()
③:注意最终时间输出时的位数,以及Date.getTime()表示的是毫秒值。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 15:57:54  更:2022-03-03 16:01:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:43:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码