搞搞算法 2:面向对象
一、题目
打印文件
示例:
题解:
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int times = Integer.valueOf(in.nextLine());Map<String, Printer> printerMap = new HashMap<>();for (int i = 0; i < times; i++) {String input = in.nextLine();String[] words = input.split(" ");if ("IN".equals(words[0])) {String printerId = words[1];int level = Integer.valueOf(words[2]);if (!printerMap.containsKey(printerId)) {printerMap.put(printerId, new Printer());}Printer printer = printerMap.get(printerId);printer.take(i + 1, level);}if ("OUT".equals(words[0])) {String printerId = words[1];Printer printer = printerMap.get(printerId);printer.output();}}}
}class Printer {List<Task> taskList = new LinkedList<>();public void take(int taskId, int level) {Task task = new Task(taskId, level);taskList.add(task);}public void output() {if (taskList.size() == 0) {System.out.println("NULL");return;}taskList.sort((a, b) -> {return b.getLevel() - a.getLevel();});System.out.println(taskList.get(0).getTaskId());taskList.remove(0);}
}class Task {private int taskId;private int level;public Task(int taskId, int level) {this.taskId = taskId;this.level = level;}public int getTaskId() {return taskId;}public int getLevel() {return level;}
}
二、总结
1 ACM模式
1.1 读完所有的示例再开始编码
不止一次,在写完代码进行验证的时候发现有特殊的情况没有考虑到。
读完所有的示例,把握所有可能的输入后再开始编码。
1.2 调试
ACM模式下编码时,要养成调试的习惯,可以将复杂的问题简单化。
1.3 控制台输入
Scanner in = new Scanner(System.in);
int i = in.nextInt();
String str = in.next();
String nextLine = in.nextLine();
需要注意一个问题,就是在 in.nextInt() 或 in.next() 之后,使用 in.nextLine() 得到的是当前行而不是下一行。
不注意的话,在循环处理所有行时,末尾的几行可能不会被处理,因为轮次已经用完了。
2 面向对象
写算法也可以面向对象。
2.1 对象排序
按照任务的优先级降序排列。
taskList.sort((a, b) -> {return b.getLevel() - a.getLevel();
});
显然 a.getLevel() - b.getLevel() 和 b.getLevel() - a.getLevel() 的结果互为相反数。
若 a.getLevel() < b.getLevel(),a.getLevel() - b.getLevel() < 0,意味着每两个做比较的对象,前面的小于后面的,所以是升序排列。
return b.getLevel() - a.getLevel() 为降序排列。
搞搞算法 2:面向对象相关推荐
- 【搞搞算法】多目标遗传算法NSGA-II的C语言代码使用手册
这是2014年4月在其他博客写的,转帖到CSDN博客上. 在之前的博文里提到过,多目标遗传算法NSGA-II的提出者之一--Kalyanmoy Deb教授实验室的网站http://www.iitk.a ...
- Python 进阶 — 面向对象编程
目录 文章目录 目录 面向对象思想 面向对象编程 面向对象编程的特性 封装 继承 多态 面向对象编程的优势 Python 的类属性与类方法 Python 类的实例化 Python 的对象属性与对象方法 ...
- python面向对象、向量化来实现神经网络和反向传播(三)
现在,我们要根据前面的算法,实现一个基本的全连接神经网络,这并不需要太多代码.我们在这里依然采用面向对象设计. 理论知识参考:https://www.zybuluo.com/hanbingtao/no ...
- 【Python基础】07、Python类与面向对象
一.面向对象编程(OOP) 程序=算法+数据结构=指令+数据 1.代码可以选择以指令为核心或以数据为核心进行编写 两种范型: 以指令为核心:围绕"正在发生什么"进行编写 面向过程编 ...
- java架构师进阶独孤九剑系列(一):数据结构与算法
" 架构师进阶系列之独孤九剑,这套秘籍如果你能完整学会,年薪至少60万起,今天是架构师进阶连载开启篇. Java程序员成长为架构师进阶步骤 未来我会用1-2个月在实战为大家讲解架构师的九大必 ...
- 选第二大算法(锦标赛算法)
算法描述 算法:FINDSECOND 输入:n个数的数组a[0...n-1] 输出:数组中的第二大的数second 算法思路 在选最大选最小算法中,我们将数组中的数两两分组进行比较,然后在较大的一组中 ...
- C++11时代的标准库快餐教程(4) - 排序算法的应用
排序算法的应用 用排序做集合运算 - 子集,交集,并集与差集 上一节我们讲了排序算法,包括快速排序sort,堆排序partial_sort和归并排序stable_sort.并且讲了排序的第一个用法,二 ...
- 编程的逻辑-用面向对象方法实现复杂业务需求
虽然不少同学一直在使用面向对象的语言进行项目开发,但是在分析.设计和编码过程中不一定用是真正的OOA/OOD/OOP的思想,贫血模型由于快速高效易上手,使用的项目不在少数,而随着软件规模和业务复杂度的 ...
- 软件测评师--第七小时 面向对象测试技术
1.面向对象技术 对象和类 传统过程式编程语言:程序=算法+数据 面向对象编程语言:程度对象+消息 三大特性 继承 1.从一个类派生到另一个类 2.派生类(子类)继承了其父类和祖先类的数据成员和成员函 ...
最新文章
- 《学习OpenCV》第三章习题 第3题
- 华为荣耀畅玩7c计算机在那,华为荣耀畅玩7C
- Eclipse与MyEclipse的选择问题
- Codeforces Round #506 (Div. 3) 1029 F. Multicolored Markers
- 菜鸟教程终极篇之Microsoft Windows Pre-installation Environment (Windows PE) 2.0
- 二进制信号量,互斥信号和计数信号量的区别
- android动画设置的单位,Kotlin语言入门—实现单位转换,view设置,动画等
- S3C2440裸奔篇之MMU
- 美国红帽软件公司是做什么的
- Android抓包方法(一) 之Fiddler代理
- 智能建筑现状及发展趋势,建筑智能化的发展趋势
- 离散数学_构造推理的证明
- Python基础必掌握的Traceback回溯机制操作详解
- 淘宝滞销宝贝怎么处理?面对滞销宝贝怎么正确处理?
- docker学习 --Compose 容器编排,常用命令等.集成spring。mysql。redis
- 中国电信 合约协议 转载
- 观察力训练(福尔摩斯演绎法)
- 大型制造企业等级保护安全建设整改方案
- cadence allegro16.6 pcb文件转pads pcb文件方法教程
- Firewalld防火墙实例配置