Java 多条件复杂排序小结
前言今天下午做了拼多多在牛客网上的在线笔试题,感觉自己的智商被鄙视到了···不过其中一道题的某一部分引起了我极大的兴趣,感觉可以总结一下,做好积累~题目的部分我拍照如下所示
这里面最复杂的就是第3点,对秒杀活动进行排序,排序条件多,排序条件使用各不相同,在笔试中给我带来了很大的困扰,最后当然也是没做完啦···· 解决方案吃完晚饭开始寻找解决方法,觉得应该会很有意思,果然看到了比较好的做法,链接在这 java多条件优先级排序 — Comparator这个方案以我这样几个月的菜鸟看来,最巧妙的就是把 多个比较器 Comparator放进一个 比较器列表 中,然后在需要时,在new一个比较器,然后在其中foreach使用各个比较器,而且注意看他代码24行的if,没有在循环中间返回结果为0的情况,而是在使用完所有比较器最后再返回0;这样就能按顺序依次使用各个比价器了。那么回到我的题目中来 我先定义了4个比较器,分别用于4中不同项目的排序比较//按人气从大到小对活动进行排序private Comparator<Activity> renqiComparator = new Comparator<Activity>() {@Overridepublic int compare(Activity o1, Activity o2) {if(goods.get(o1.goodsId).renQi == goods.get(o2.goodsId).renQi) {return 0;} else {return goods.get(o1.goodsId).renQi > goods.get(o2.goodsId).renQi ? -1 : 1;}}};//按商品id从小到大排序private Comparator<Activity> idComparator = new Comparator<Activity>() {@Overridepublic int compare(Activity o1, Activity o2) {if(o1.goodsId == o2.goodsId) {return 0;} else {return o1.goodsId > o2.goodsId ? 1 : -1;}}};//按活动开始时间从早到晚排序private Comparator<Activity> startTimeComparator = new Comparator<Activity>() {@Overridepublic int compare(Activity o1, Activity o2) {if(o1.startTime == o2.startTime) {return 0;} else {return o1.startTime > o2.startTime ? 1 :-1;}}};//按活动的最后卖出时间从晚到早排序private Comparator<Activity> sellTimeComparator = new Comparator<Activity>() {@Overridepublic int compare(Activity o1, Activity o2) {if(o1.sellTime == o2.sellTime) {return 0;} else {return o1.sellTime > o2.sellTime ? -1 : 1;}}}; 然后定义了三个比较器列表,分别用于三种情况下的比较,然后在构造器中初始化这3个比较器列表public Main3() {//在构造器中把这个复杂的比较器列表进行初始化//对于进行中(未售罄)的活动,按商品人气从高到低、商品ID从小到大排序 activityComparatorList1.add(renqiComparator);activityComparatorList1.add(idComparator);//对于进行中(已售罄)的活动,按最后卖出时间从晚到早、商品人气从高到低、商品ID从小到大排序 activityComparatorList2.add(sellTimeComparator);activityComparatorList2.add(renqiComparator);activityComparatorList2.add(idComparator);//对于未开始的活动,依次按开始时间从早到晚、商品人气从高到低、商品ID从小到大排序 activityComparatorList3.add(startTimeComparator);activityComparatorList3.add(renqiComparator);activityComparatorList3.add(idComparator);} 最后再需要对活动排序的地方这样使用,针对不同阶段使用不同的比较器列表。Collections.sort(list, new Comparator<Activity>() {@Overridepublic int compare(Activity o1, Activity o2) {//在同一阶段内的比较if(o1.limitQuantity>0 && o2.limitQuantity>0) {//进行中未售罄for(Comparator<Activity> comparator : activityComparatorList1) {if(comparator.compare(o1, o2) < 0) {return -1;} else if(comparator.compare(o1, o2) > 0) {return 1;}}return 0; //关键在这,里面的比较器给出0时不处理,指导全部比较完成都相等的情况下才给出0 } else if(o1.limitQuantity == 0 && o2.limitQuantity == 0) {//进行中已售罄for(Comparator<Activity> comparator : activityComparatorList2) {if(comparator.compare(o1, o2) < 0) {return -1;} else if(comparator.compare(o1, o2) > 0) {return 1;}}return 0; //关键在这,里面的比较器给出0时不处理,指导全部比较完成都相等的情况下才给出0 } else if(o1.startTime>time && o2.startTime>time) { //未开始活动for(Comparator<Activity> comparator : activityComparatorList3) {if(comparator.compare(o1, o2) < 0) {return -1;} else if(comparator.compare(o1, o2) > 0) {return 1;}}return 0; //关键在这,里面的比较器给出0时不处理,指导全部比较完成都相等的情况下才给出0 }//在不同阶段的比较if(o1.limitQuantity > 0 && (o2.limitQuantity == 0 || o2.startTime>time)) {return -1;} else if(o1.limitQuantity == 0 && o2.startTime>time) {return -1;} else {return 1;}}}); 这样我感觉是比较合理的解决了这样一个多重不同条件的比较问题,而且感觉没有使用过多的判断使得逻辑混乱。 附全部代码这道题最后也没有放在OJ上测试过,所以可能有错,仅供参考package com.pinduoduo;import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Scanner;public class Main3 {public HashMap<Integer, Good> goods = new HashMap<>();public ArrayList<Activity> activities = new ArrayList<>();public List<Comparator<Activity>> activityComparatorList1 = new ArrayList<>();public List<Comparator<Activity>> activityComparatorList2 = new ArrayList<>();public List<Comparator<Activity>> activityComparatorList3 = new ArrayList<>();//按人气从大到小对活动进行排序private Comparator<Activity> renqiComparator = new Comparator<Activity>() {@Overridepublic int compare(Activity o1, Activity o2) {if(goods.get(o1.goodsId).renQi == goods.get(o2.goodsId).renQi) {return 0;} else {return goods.get(o1.goodsId).renQi > goods.get(o2.goodsId).renQi ? -1 : 1;}}};//按商品id从小到大排序private Comparator<Activity> idComparator = new Comparator<Activity>() {@Overridepublic int compare(Activity o1, Activity o2) {if(o1.goodsId == o2.goodsId) {return 0;} else {return o1.goodsId > o2.goodsId ? 1 : -1;}}};//按活动开始时间从早到晚排序private Comparator<Activity> startTimeComparator = new Comparator<Activity>() {@Overridepublic int compare(Activity o1, Activity o2) {if(o1.startTime == o2.startTime) {return 0;} else {return o1.startTime > o2.startTime ? 1 :-1;}}};//按活动的最后卖出时间从晚到早排序private Comparator<Activity> sellTimeComparator = new Comparator<Activity>() {@Overridepublic int compare(Activity o1, Activity o2) {if(o1.sellTime == o2.sellTime) {return 0;} else {return o1.sellTime > o2.sellTime ? -1 : 1;}}};public Main3() {//在构造器中把这个复杂的比较器列表进行初始化//对于进行中(未售罄)的活动,按商品人气从高到低、商品ID从小到大排序 activityComparatorList1.add(renqiComparator);activityComparatorList1.add(idComparator);//对于进行中(已售罄)的活动,按最后卖出时间从晚到早、商品人气从高到低、商品ID从小到大排序 activityComparatorList2.add(sellTimeComparator);activityComparatorList2.add(renqiComparator);activityComparatorList2.add(idComparator);//对于未开始的活动,依次按开始时间从早到晚、商品人气从高到低、商品ID从小到大排序 activityComparatorList3.add(startTimeComparator);activityComparatorList3.add(renqiComparator);activityComparatorList3.add(idComparator);}public int addActivity(int startTime, int endTime, int goodsId, int limitQuantity) {if(limitQuantity <= goods.get(goodsId).kuCun) {Activity activity = new Activity();activity.startTime = startTime;activity.endTime = endTime;activity.goodsId = goodsId;activity.limitQuantity = limitQuantity;activity.id = activities.size();activities.add(activity);return activity.id;}return -1;}public int buyGoods(int time, int activityId, int quantity) {Activity activity = activities.get(activityId);int startTime = activity.startTime;int endTime = activity.endTime;int limitQuantity = activity.limitQuantity;if(time < startTime || time >= endTime) {return -1;} else if(quantity > limitQuantity) {return -1;} else {activity.limitQuantity -= quantity;activity.sellTime = time;return 0;}}public List<Activity> getActivityList(int time) {ArrayList<Activity> list = new ArrayList<>();for (Activity activity : activities) {if(time >= activity.startTime && time < activity.endTime) {list.add(activity);}}Collections.sort(list, new Comparator<Activity>() {@Overridepublic int compare(Activity o1, Activity o2) {//在同一阶段内的比较if(o1.limitQuantity>0 && o2.limitQuantity>0) {//进行中未售罄for(Comparator<Activity> comparator : activityComparatorList1) {if(comparator.compare(o1, o2) < 0) {return -1;} else if(comparator.compare(o1, o2) > 0) {return 1;}}return 0; //关键在这,里面的比较器给出0时不处理,指导全部比较完成都相等的情况下才给出0 } else if(o1.limitQuantity == 0 && o2.limitQuantity == 0) {//进行中已售罄for(Comparator<Activity> comparator : activityComparatorList2) {if(comparator.compare(o1, o2) < 0) {return -1;} else if(comparator.compare(o1, o2) > 0) {return 1;}}return 0; //关键在这,里面的比较器给出0时不处理,指导全部比较完成都相等的情况下才给出0 } else if(o1.startTime>time && o2.startTime>time) { //未开始活动for(Comparator<Activity> comparator : activityComparatorList3) {if(comparator.compare(o1, o2) < 0) {return -1;} else if(comparator.compare(o1, o2) > 0) {return 1;}}return 0; //关键在这,里面的比较器给出0时不处理,指导全部比较完成都相等的情况下才给出0 }//在不同阶段的比较if(o1.limitQuantity > 0 && (o2.limitQuantity == 0 || o2.startTime>time)) {return -1;} else if(o1.limitQuantity == 0 && o2.startTime>time) {return -1;} else {return 1;}}});return list;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);Main3 main = new Main3();int n = sc.nextInt();int m = sc.nextInt();for(int i=0; i<n; i++) {Good good = new Good();good.id = sc.nextInt();good.renQi = sc.nextInt();good.kuCun = sc.nextInt();main.goods.put(good.id, good);}sc.nextLine();String[] ask = new String[m];for(int i=0; i<m; i++) {ask[i] = sc.nextLine();}for(int i=0; i<m; i++) {String[] command = ask[i].split(" ");if("add".equals(command[1])) {int time = Integer.parseInt(command[0]);int startTime = Integer.parseInt(command[2]);int endTime = Integer.parseInt(command[3]);int goodsId = Integer.parseInt(command[4]);int limitQuantity = Integer.parseInt(command[5]);System.out.println(main.addActivity(startTime, endTime, goodsId, limitQuantity));} else if("buy".equals(command[1])) {int time = Integer.parseInt(command[0]);int activityId = Integer.parseInt(command[2]);int quantity = Integer.parseInt(command[3]);System.out.println(main.buyGoods(time, activityId, quantity));} else if("list".equals(command[1])){int time = Integer.parseInt(command[0]);List<Activity> list = main.getActivityList(time);for (Activity activity : list) {System.out.print(activity.id+" ");}System.out.println();}}}}class Good {public int id;public int renQi;public int kuCun; }class Activity {public int id;public int startTime;public int endTime;public int goodsId;public int limitQuantity;public int sellTime; }
转载于:https://www.cnblogs.com/Free-Thinker/p/10654455.html
Java 多条件复杂排序小结相关推荐
- java 多条件比较_Java 多条件复杂排序小结
这里面最复杂的就是第3点,对秒杀活动进行排序,排序条件多,排序条件使用各不相同,在笔试中给我带来了很大的困扰,最后当然也是没做完啦···· 解决方案 吃完晚饭开始寻找解决方法,觉得应该会很有意思,果然 ...
- java 8 排序反转_Java 8 排序小结
1.概述 首先,让我们先定义一个简单的实体类: @Data public class Human { private String name; private int age; public Huma ...
- JAVA学习-数组元素排序
JAVA实现数组元素排序,把数组中已知的10个数字由小到大排序后输出 代码: public class ArraryRank {//定义公共类public static void main(Strin ...
- Java数组与八大排序
文章目录 浅谈数组 数组初始化 知识捡漏静态初始化写法 数组操作:反转 二维数组 数组的练习:根据数组元素查找该元素第一次在数组中出现的索引 方法1:挨个遍历查找法 方法2:二分查找法 二 数组常见的 ...
- Java数据结构第一讲-排序算法
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- java用lambda函数排序,Java8:使用Lambda表达式增强版Comparator排序
学习路上的自我记录-------路好长,就问你慌不慌,大声港,不慌.----jstarseven. 实体类: package com.server.model; /** * Created by js ...
- java 中的排序_浅谈java中常见的排序
浅谈java中常见的排序 学过java的人都知道,排序这一部分初次接触感觉还是有点难以理解,很多地方也会用到.然而,在java中常见的排序方法:冒泡排序,选择排序,插入排序等等.下面就让我们一起揭开他 ...
- Java中getResourceAsStream的用法小结
2019独角兽企业重金招聘Python工程师标准>>> Java中getResourceAsStream的用法小结 一.Java中的getResourceAsStream主要有以下三 ...
- Py之pandas:对dataframe型数据排序相关的问题总结之按照多个字段的多个条件进行排序(先打乱再排序)
Py之pandas:对dataframe型数据排序相关的问题总结之按照多个字段的多个条件进行排序(先打乱再排序) 目录 对dataframe型数据排序相关的问题总结之按照多个字段的多个条件进行排序(先 ...
最新文章
- 2021 年大厂面试高频架构题汇总(附答案详解)
- 如何计算_平整场地如何计算?
- 花之吻自己查错误订单的一个小脚本
- 前端学习(1289):nodejs模块化的开发规范
- c语言作业题五六章答案,数据结构(C语言版)第五六章习题答案
- c语言 若未给全局变量赋初值,自我测试练习参考-答案.doc
- python每行输出8个式子_多图+代码 | 详解Python操作Excel神器openpyxl的各种操作!
- mysql 用户及权限
- 2022-2028年全球与中国汽车齿轮齿条转向系统产业市场前瞻与投资战略规划分析报告
- 微信小微商户申请入驻接口PHP示例
- 股票放量一定就是好事么,为什么从爆大量的高位开始下跌?
- 不引入外部文件也可以显示图片
- 商品详情页中特别注意的三件事
- 我们为何渐渐放弃了自己的梦想?
- 转载天大一位学长的帖子
- C语言——malloc与free
- 魔兽世界服务器存档位置,选择服务器也有大学问?新手入坑《魔兽世界》该在哪里“扎根”...
- java自带发送邮件,成都汇智动力-java邮件发送只需要java自带的mailjar
- java驱动打印机_本地打印机驱动程序如何找到网络打印机?
- 计算机应用和管理系统,《管理信息系统和计算机应用》.ppt
热门文章
- 美国IARPA发起人脸识别算法融合大奖赛
- 零基础转行学习python是否还在纠结?这里告诉你答案!
- 最新变体Transformer!∞-former!DeepMind 出品!
- 无意间发现BAT大佬总结的一份目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)...
- PyTorch | torch.full()使用方法 | torch.full()如何使用? torch.full()例子说明 | 通过torch.full创建全相同的张量
- 顶尖学府 加州伯克利大学开发高效机器人操纵框架
- 收藏 | 卷积神经网络中十大拍案叫绝的操作
- 大数据分析实战-信用卡欺诈检测(三)- 模型评估
- 地理坐标系和投影坐标系的区别
- python链表节点的插入p.next curnode_leetcode刷题总结之链表