JAVA sku商品数据经典试题

  • 试题1
  • 试题2
  • 试题3
    • 试题代码
    • 试题所有相关代码github:

试题1

假设sku数据很多, 无法将sku列表完全加载到内存中,从/resources/data/data.xls读取数据并逐条打印数据

试题2

假设sku数据很多, 无法将sku列表完全加载到内存中,计算以下统计值:
1、获取价格在最中间的任意一个skuId,假设所有sku的价格都是精确到1元且一定小于1万元
2、每个渠道库存量为前五的skuId列表 例如( miao:[1,2,3,4,5],tmall:[3,4,5,6,7],intime:[7,8,4,3,1]
3、所有sku的总价值

试题3

假设sku数据很多, 无法将sku列表完全加载到内存中,基于试题1, 实现一个生产者消费者, 将sku列表聚合为商品, 并通过回调函数返回,
聚合规则为:
1、对于sku type为原始商品(ORIGIN)的, 按货号(artNo)聚合成ITEM
2、对于sku type为数字化商品(DIGITAL)的, 按spuId聚合成ITEM
3、聚合结果需要包含: item的最大价格、最小价格、sku列表及总库存

试题代码

import com.alibaba.fastjson.JSON;
import com.alibaba.mos.api.ProviderConsumer;
import com.alibaba.mos.api.SkuReadService;
import com.alibaba.mos.data.ChannelInventoryDO;
import com.alibaba.mos.data.ItemDO;
import com.alibaba.mos.data.SkuDO;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.Assert;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;/*** 注意: 假设sku数据很多, 无法将sku列表完全加载到内存中*/
@SpringBootTest
@Slf4j
class Interview2Tests {@AutowiredSkuReadService skuReadService;@AutowiredProviderConsumer<List<ItemDO>> providerConsumer;private static Logger log = LoggerFactory.getLogger(Interview2Tests.class);/*** 试题1:* 注意: 假设sku数据很多, 无法将sku列表完全加载到内存中* 在com.alibaba.mos.service.SkuReadServiceImpl中实现com.alibaba.mos.api.SkuReadService#loadSkus(com.alibaba.mos.api.SkuReadService.SkuHandler)* 从/resources/data/data.xls读取数据并逐条打印数据*/@Testvoid readDataFromExcelWithHandlerTest() {AtomicInteger count = new AtomicInteger();skuReadService.loadSkus(skuDO -> {log.info("读取SKU信息={}", JSON.toJSONString(skuDO));count.incrementAndGet();return skuDO;});Assert.isTrue(count.get() == 10, "未能读取商品列表");}/*** 试题2:* 注意: 假设sku数据很多, 无法将sku列表完全加载到内存中* 计算以下统计值:* 1、获取价格在最中间的任意一个skuId,假设所有sku的价格都是精确到1元且一定小于1万元* 2、每个渠道库存量为前五的skuId列表 例如( miao:[1,2,3,4,5],tmall:[3,4,5,6,7],intime:[7,8,4,3,1]* 3、所有sku的总价值*/@Testvoid statisticsDataTest() {AtomicInteger count = new AtomicInteger();List<SkuDO> skuDOList = new ArrayList<>();skuReadService.loadSkus(skuDO -> {count.incrementAndGet();skuDOList.add(skuDO);return skuDO;});Assert.isTrue(count.get() == 10, "未能读取商品列表");if (count.get() == 10) {BigDecimal skuCount = skuDOList.stream().map(SkuDO::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);BigDecimal average = skuDOList.stream().map(SkuDO::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(skuDOList.size()), 2, BigDecimal.ROUND_HALF_UP);int minDifference = Math.abs(skuDOList.get(0).getPrice().intValue() - average.intValue());int minIndex = 0;for (int i = 1; i < skuDOList.size(); i++) {int temp = Math.abs(skuDOList.get(i).getPrice().intValue() - average.intValue());if (temp < minDifference) {minIndex = i;minDifference = temp;}}List<ChannelInventoryDO> cidList = new ArrayList<>();for (int i = 0; i < skuDOList.size(); i++) {List<ChannelInventoryDO> list = skuDOList.get(i).getInventoryList();for (int ii = 0; ii < list.size(); ii++) {cidList.add(list.get(ii));}}//按照库存量降序cidList = cidList.stream().sorted(Comparator.comparing(ChannelInventoryDO::getInventory).reversed()).collect(Collectors.toList());//按渠道分组Map<String, List<ChannelInventoryDO>> cidMap = cidList.stream().collect(Collectors.groupingBy(ChannelInventoryDO::getChannelCode));StringBuilder sb = new StringBuilder();for(Map.Entry<String, List<ChannelInventoryDO>> entry : cidMap.entrySet()){String channelCode = entry.getKey();if(sb.length()>0){sb.append(",");}sb.append(channelCode + ":[");List<ChannelInventoryDO> cList = entry.getValue();cList = cList.stream().limit(5).collect(Collectors.toList());StringBuilder sbn = new StringBuilder();for (int ii = 0; ii < cList.size(); ii++) {if(sbn.length()>0){sbn.append(",");}sbn.append(cList.get(ii).getSkuId());}sb.append(sbn.toString() + "]");}log.info("价格在最中间的任意一个skuId={}", skuDOList.get(minIndex).getId());log.info("每个渠道库存量为前五的skuId列表={}", sb.toString());log.info("所有sku的总价值={}", skuCount);}}/*** 试题3:* 注意: 假设sku数据很多, 无法将sku列表完全加载到内存中* 基于试题1, 在com.alibaba.mos.service.ItemAggregationProviderConsumer中实现一个生产者消费者, 将sku列表聚合为商品, 并通过回调函数返回,* 聚合规则为:* 对于sku type为原始商品(ORIGIN)的, 按货号(artNo)聚合成ITEM* 对于sku type为数字化商品(DIGITAL)的, 按spuId聚合成ITEM* 聚合结果需要包含: item的最大价格、最小价格、sku列表及总库存*/@Testvoid aggregationSkusWithConsumerProviderTest() {AtomicInteger count = new AtomicInteger();providerConsumer.execute(list -> {list.forEach(item -> {log.info("聚合后ITEM信息={}", JSON.toJSONString(item));count.incrementAndGet();});return list;});Assert.isTrue(count.get() == 7, "未能聚合商品列表");}
}

试题所有相关代码github:

https://github.com/276255322/mos-interview

JAVA sku商品数据经典试题相关推荐

  1. Java算法:牛客网Java版剑指Offer全套算法面试题目整理及电子档,Java算法与数据结构面试题,面试刷题、背题必备!牛客网剑指offer

    剑指offer(java版) 牛客网Java版剑指Offer全套题目67道 资源来源于网络 目录 1.二维数组中的查找 2.替换空格 3.从尾到头打印链表 4.重建二叉树 5.用两个栈实现队列 6.旋 ...

  2. Java面试之数据库面试题

    1.触发器的作用? 触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的.它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化.可以联级运算.如,某表 ...

  3. java方向大数据面试题整理

    1.String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据这个String类提供了数值不可 ...

  4. 经典java程序员的面试题及答案

    今天动力节点java培训机构小编为大家分享"经典java程序员的面试题及答案",希望通过此文能够帮助到正在找工作或是即将毕业的"你",下面就随小编一起看看经典j ...

  5. 【100道面试题真题讲解】C++面试题讲解+JAVA面试题讲解+Linux面试题讲解+数据结构面试题+计算机网络面试题 讲解视频-持续更新中

    最近找到了一个非常好的公众号:IT笔试面试真题讲解,每天视频分享一道IT公司面试高频题目,完全免费哦,非常适合找工作的学生复习+总结+提炼. 白嫖不敢独吞,分享给大家,也给作者增加一点访问量,鼓励作者 ...

  6. Java实现商品sku属性组合

    开发中实现商品模块时,会遇到商品sku组合问题,有两种解决方案,一种由前端实现sku属性组合然后传递到后台:第二种则由后台实现,这里就来记录一下,如何使用java的for循环实现sku商品属性组合: ...

  7. 经典大数据面试题及解析

    经典大数据面试题及解析 1.下列哪个属性是hdfs-site.xml中的配置? A.dfs.replication B.fs.defaultFS C.mapreduce.framework.name ...

  8. Java 程序员必须掌握的 8 道数据结构面试题,你会几道

    转载自  Java 程序员必须掌握的 8 道数据结构面试题,你会几道 瑞士计算机科学家Niklaus Wirth在1976年写了一本书,名为<算法+数据结构=编程>. 40多年后,这个等式 ...

  9. 关于电商商品数据API接口列表,你想知道的(详情页、Sku信息、商品描述、评论问答列表)

    目录 一.商品数据API接口列表 二.商品详情数据API调用代码item_get 三.获取sku详细信息item_sku 四.获得淘宝商品评论item_review 五.数据说明文档 进入 一.商品数 ...

最新文章

  1. 加强版dd工具dc3dd
  2. 【Linux】ubuntu或linux网卡配置/etc/network/interfaces
  3. 自动化测试中,测试数据如何管理?
  4. ubuntu安装五笔输入法(ibus-table-wubi)
  5. 中小企业网络管理技术完全篇
  6. 利用阿里云自定义镜像实现服务器数据/网站快速迁移
  7. 【My Project】数字频率测量FPGA实现
  8. 大数据技术对企业的影响有哪些
  9. GO语言学习之路17
  10. 使用python读取txt坐标文件生成挖空地块_批量
  11. 百度云满速下载原理与方法
  12. CentOS 7下载及安装教程
  13. Android打开pdf文件
  14. 为了对电脑进行保护,已经阻止此应用 解决办法
  15. YY协议官方下载|YY协议|YY协议下载|唯一官方网站www.yyfass.com
  16. MySQL字符串数据类型
  17. 计算机EI检索论文,EI检索论文
  18. 层次分析法------小学生都会的算法~~~
  19. 看过这篇文章,一切关于NFT的疑问都可以迎刃而解
  20. 神了,阿里数据库专家纯手写了这份604页的Oracle+MySQL攻坚指南

热门文章

  1. Spark RDD使用详解--RDD原理
  2. k8s node节点停机维护,pod如何迁移?
  3. (四)es6 正则的拓展
  4. 铁甲雄心——机器人商用的求生之路
  5. 今年春节琼州海峡天气乐观 海南多部门“未雾绸缪”
  6. JAVA-SSH2:JSch试用
  7. CSR8675的DSP学习笔记——a2dp_sink工程的matlab仿真
  8. oracle常用函数使用大全 Oracle除法
  9. java-php-python-springboot-中医药院校科研会议系统-计算机毕业设计
  10. 我最近学python_我要偷偷的学Python,然后惊呆所有人(第十六天)