华为三面@java8 stream流操作面试题

前言:华为三面考了个很简单的基础编程,就是java8 Stream流操作,太久没写,也是没掌握好java基础直接搞得措手不及,stream两行代码的事情,写了好久,用各种集合写完了,还漏了一个要求。
题目如下

停车记录表中记录三个字段:车牌号,停车日期,停车时长;要求统计出,某月份停车时长最长的前5,如果存在相同时长则按照车牌号的字段序统计;要求自己定义数据结构,赋值,输出结果。数据举例
{“B01562”,“2021-05-26”,“15”},
{“B01562”,“2021-05-27”,“18”},
{“B01563”,“2021-05-27”,“17”},
{“B01560”,“2021-05-27”,“11”},
{“B01563”,“2021-05-26”,“16”}

定义数据结构

这里我用了lombok注解,当时的环境中没有引入,但是生成get、set方法很方便

@Data
class Record{/*** 车牌号*/private String carNo;/*** 停车日期 2015-12-01*/private Date parkDate;/*** 停车时间*/private Integer duration;}

先简单处理下数据,将二元数组转为list

/*** 二元数组转List<Record>* @param data* @return*/private static List<Record> process(String[][]  data){List<Record> list=new ArrayList<>();SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");//idea 包裹代码段快捷键 ctrl+alt+Ttry {for (String[] item : data) {Record record=new Record();record.setCarNo(item[0]);record.setParkDate(sdf.parse(item[1]));record.setDuration(Integer.valueOf(item[2]));list.add(record);}} catch (ParseException e) {e.printStackTrace();}return list;}

main函数

数组题目中有给,车牌号什么的是我后面自己写随便写的

public static void main(String[] args) {String[][]  data=new String[][]{{"B01562","2021-05-26","15"},{"B01562","2021-05-27","18"},{"B01563","2021-05-27","17"},{"B01560","2021-05-27","11"},{"B01563","2021-05-26","16"}};statLimit5(5,process(data)).forEach(item-> System.out.println(item.getCarNo()+"当月停车时长:"+item.getDuration()));}

主要的统计方法

当时忘记排序了,也不知道两个字段要如何排序,已经顺序逆序等

/*** 统计总时长的前五,时长一致,按照车牌号排序* @param month* @param recordList* @return*/private static List<Record> statLimit5(int month,List<Record> recordList){List<Record> statList=new ArrayList<>();recordList.stream().filter(item -> getDateByField(item.getParkDate(), Calendar.MONTH) + 1 == month).collect(Collectors.groupingBy(Record::getCarNo, Collectors.toList())).forEach((k,v)->{Record r=new Record();r.setCarNo(k);r.setDuration(v.stream().map(Record::getDuration).reduce(0,Integer::sum));statList.add(r);});return statList.stream().sorted(Comparator.comparing(Record::getDuration).reversed().thenComparing(Record::getCarNo)).limit(5).collect(Collectors.toList());}

工具方法

这个方法是获取日期中月份用的,当时编程Date类里的getMonth已经不推荐使用了,后面查了下,应该使用calendar的get方法,之所以多些这个方法是考虑到可能有需求对比年、月、日

/*** 获取日期的对应字段的值* @param date* @param field* @return*/private static int getDateByField(Date date,int field){Calendar calendar=Calendar.getInstance();calendar.setTime(date);return calendar.get(field);}

总结

其实这个题比起算法题简单多了,但是对java的基础考察的很好。需要:

  1. 定义实体类,优雅的生成测试数据
  2. 测试数据录入时,字符串转化为时间的方法
  3. Collectors的分组方法、toList方法;
  4. Comparator的comparing、thenComparing、reversed方法等;
  5. Calendar 中获取月份字段时需要+1的坑处理,替代Date中废弃的getMonth方法等
  6. java 8 Stream的操作熟练度等等

java8 Stream流【华为3面】相关推荐

  1. Java8——Stream流

    Java8--Stream流 Stream是数据渠道,用于操作集合.数组等生成的元素序列. Stream操作的三个步骤: 创建Stream 中间操作 终止操作 一.获取stream的四种方式 1.通过 ...

  2. java8 stream流 将一个list转换成list

    java8 stream流 将一个对象集合转换成另一个对象集合 案例一: // 利用stream进行类型转化     List<String> stringList = new Array ...

  3. Java8 Stream 流 一些使用整理(持续更新)

    Java8 Stream 流 一些使用整理 双循环判断值 原始写法 Stream 普通写法 Stream filter + anyMatch写法 持续更新中 双循环判断值 原始写法 List<C ...

  4. 学习Java8 Stream流,让我们更加便捷的操纵集合

    1. 概述 本篇文章会简略的介绍一下 Lambda 表达式,然后开启我们的正题 Java8 Stream 流,希望观众老爷们多多支持,并在评论区批评指正! Java8 的 Stream 流使用的是函数 ...

  5. Java8 Stream流递归,几行代码搞定遍历树形结构

    欢迎关注方志朋的博客,回复"666"获面试宝典 可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中 ...

  6. [转载] Java8 Stream流遍历 如何使用索引

    参考链接: Java 8中迭代带有索引的流Stream 1. 问题来源 Java8的Stream流为我们的遍历集合带来了方便,基本可以取代for循环了.但是有一些情况需要知道当前遍历的索引,使用for ...

  7. [编程] Java8 Stream(流式计算) 常见的一些用法汇总

    前提:以下基于 List<Student> 列表进行举例,大家实际使用进行举一反三即可.大同小异,Java8 的流式计算功能很强大,需要大家实际应用中逐渐挖掘更高级的用法. Student ...

  8. Java8 Stream流操作在用户系统中的妙用

    在做目前这个项目的时候,发现以前有一个筛选的需求,老程序员是这么做的,先请求Http服务器得到一长串json数据,大概用A4纸打了40多页那么多,然后将这些对象写入到sqlite数据库中,再用数据库查 ...

  9. java8 Stream流

    目录 前言 一.stream的使用场景特点 特点: 二.初步体验一下stream 三.简单看一下Stream的常用API 3.1 forEach()遍历集合中的对象 3.2filter对流对象进行过滤 ...

最新文章

  1. C++ memset
  2. Apache Flink 零基础入门(十一)Flink transformation
  3. Diagram of Interpositioning and Default Global Scope插入和默认全局范围图
  4. C语言 数组中删除指定字符
  5. 【毕业设计】jSP在线教学质量评价系统的设计与实现(源代码+论文)
  6. Ubuntu Mysql安装配置
  7. NYOJ11 - 奇偶数分离
  8. 每日算法系列【LeetCode 503】下一个更大元素 II
  9. 后台仿京东商城接口设计缺陷吐槽篇
  10. 华三ap设置无线服务器,H3C无线控制器V5版本配置AP上线的方法
  11. MATLAB db4小波分解与重构,语音降噪
  12. ib网卡命令_InfiniBand 网卡测试
  13. 科技风杂志科技风杂志社科技风编辑部2022年第16期目录
  14. android apktool反编译,apktool反编译工具
  15. Elasticsearch:使用向量搜索来查询及比较文字 - NLP text embedding
  16. 不折腾会死星人Kindle Paperwhite4拆机翻新记
  17. 问题事件名称: APPCRASH(解决方法)
  18. win服务器物理内存占用高,win10系统长时间使用物理内存过高的解决方法
  19. java网络编程实用精解_Java网络编程实用精解
  20. R语言:优雅、卓越的统计分析及绘图环境

热门文章

  1. Ambari简介安装
  2. 蓝海创意云渲染教程:查看渲染计费方式?
  3. idea中设置python环境
  4. 智能Web算法第二版前言和译者序
  5. Mac-Web服务器映射外网-ngrok
  6. matlab将三维模型渲染成二维视图,由三维图生成二维视图的新探讨
  7. 解决sublime快捷键回车换行问题
  8. Jvm垃圾收集器调优工具调优指南
  9. 大疆嵌入式笔试试题整理最全(附超详细知识点整理与详解)
  10. 腾讯17年发展史上的14个关键点