电商商品排行,电商商品排行榜?
在电商平台上,榜单信息如新品榜和畅销榜十分常见。这些榜单为用户提供了直观的商品销量比较,从而激发更多用户的购买欲望或将商品加入购物车。本文将探讨如何构建一个基本的榜单功能。
榜单定义
在某个应用上,我们可以找到以下的小米手表排名:
需要实现几个功能:
榜单是针对某类商品进行统计,比如手机排行是统计品类为手机的商品。排行统计可以是按照某一个维度,比如订单量、一个月回购量、或者几个指数汇总成一个分数进行排行。上图就是根据热卖指数进行排行。除了排行之外,还需要展示霸榜的天数,比如霸榜榜首 n 天、霸榜前三 n 天。上面排名第一就展示了霸榜榜首的天数。榜单实现思路
为了进行统计分析,至少需要设置两种表格,即榜单主表和榜单明细表。
主表记录榜单信息,比如xx月xx手机畅销榜,统计维度、统计时间范围等等。明细表主要记录,商品有信息、排行、统计销量、分数等信息。
在完成榜单创建后,需定时执行统计任务,以便更新榜单的详细信息。在统计过程中,查询数据库的维度应根据实际需求而定,接着进行分数计算,最终确定排名。
该实现过程相对简单,主要是通过去除相关数据来进行汇总和计算。其中,最关键的功能是计算霸榜的天数。
霸榜天数
榜单占据排行榜的方式主要有两种:一种是连续占据榜首的天数,另一种是占据前三名的天数。为此,我们需要新增一个表格,用于记录每天的榜单详情。以下是一个示例,记录了三天的榜单明细日志:
霸榜的天数统计是从最后一天开始计算的,需要找出连续的天数并确定最后一天就是4日。在这一天,前三的商品为C、A和B。为了统计霸榜的情况,我们要观察4日的榜首商品C,然后往回推算,看3日的商品是否也是C。
如果3日的商品不是C,那么就记录4日为霸榜1天。如果3日的商品是C,则继续向前查找,累计连续的霸榜天数,直到遇到非C商品为止。这样可以确定商品C连续霸榜的天数。
要统计排名前三的商品,其实涉及到两个数据的收集。首先,已经包含了榜首的商品,所以我们只需着重统计第二和第三名的商品,即商品 A 和商品 B。接下来,我们需要向前查询相关数据:
统计榜首
创建榜单明细日志类:
“`java
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
class RankingLogDetail {
/**
* 商品名称
*/
private String item;
/**
* 排名
*/
private Integer position;
/**
* 创建时间
*/
private String timestamp;
}
“`
创建模拟数据:
RankDetailLog logEntry1=new RankDetailLog("C", 1, "7月4日");
RankDetailLog logEntry2=new RankDetailLog("A", 2, "7月4日");
RankDetailLog logEntry3=new RankDetailLog("B", 3, "7月4日");
RankDetailLog logEntry4=new RankDetailLog("D", 1, "7月2日");
RankDetailLog logEntry5=new RankDetailLog("B", 2, "7月2日");
RankDetailLog logEntry6=new RankDetailLog("C", 3, "7月2日");
RankDetailLog logEntry7=new RankDetailLog("B", 1, "7月3日");
RankDetailLog logEntry8=new RankDetailLog("C", 2, "7月3日");
RankDetailLog logEntry9=new RankDetailLog("A", 3, "7月3日");
List<RankDetailLog> rankLogEntries=new ArrayList<>();
rankLogEntries.add(logEntry4);
rankLogEntries.add(logEntry5);
rankLogEntries.add(logEntry6);
rankLogEntries.add(logEntry7);
rankLogEntries.add(logEntry8);
rankLogEntries.add(logEntry9);
rankLogEntries.add(logEntry1);
rankLogEntries.add(logEntry2);
rankLogEntries.add(logEntry3);
分组排序:
“`java
// 按创建时间对列表进行分组和逆序排序
Map<String, List<RankDetailLog>> groupedAndSortedLogs=detailLogList.stream()
.collect(Collectors.groupingBy(RankDetailLog::getCreateTimeStr,
() -> new TreeMap<>(Comparator.reverseOrder()),
Collectors.toList()));
“`
统计榜首:
“`java
String leadingProduct=null;
int leadingProductCount=0;
for (Map.Entry<String, List<RankDetailLog>> entry : sortedCreateTimeMap.entrySet()) {
List<RankDetailLog> rankDetails=entry.getValue();
if (!rankDetails.isEmpty()) {
RankDetailLog firstLog=rankDetails.get(0);
String currentLeadingProduct=firstLog.getProduct();
if (leadingProduct==null) {
leadingProduct=currentLeadingProduct;
leadingProductCount=1;
} else {
if (leadingProduct.equals(currentLeadingProduct)) {
leadingProductCount++;
} else {
break;
}
}
}
}
System.out.println("销售冠军商品:" + leadingProduct + ",出现天数:" + leadingProductCount);
“`
C:1 表示该商品在排行榜中维持了第一的位置达一天之久。
步骤详解:
topProduct 标记榜首商品,topProductNum 榜首天数记录。遍历集合,记录榜首商品,然后天数设置1。遍历数据,如果是连续的数据,数量 +1。找不到商品就结束遍历。统计前三
前三的统计实际上是将榜首排除在外,仅仅统计最新数据中排名第2和第3的商品。这是一种向前汇总的统计方法。
“`java
Set<String> productSet=new HashSet<>();
Map<String, Integer> productCountMap=new HashMap<>();
boolean isFirstIteration=true;
for (Map.Entry<String, List<RankDetailLog>> entry : sortedCreateTimeMap.entrySet()) {
List<RankDetailLog> detailLogs=entry.getValue();
if (!detailLogs.isEmpty()) {
// Only take the first three items
detailLogs=detailLogs.subList(0, Math.min(3, detailLogs.size()));
if (isFirstIteration) {
for (int index=0; index < detailLogs.size(); index++) {
RankDetailLog log=detailLogs.get(index);
String product=log.getProduct();
if (index >=1) {
productSet.add(product);
productCountMap.put(product, 0);
}
}
isFirstIteration=false;
} else {
Set<String> currentProductSet=new HashSet<>();
for (RankDetailLog log : detailLogs) {
String product=log.getProduct();
if (productCountMap.containsKey(product)) {
productCountMap.put(product, productCountMap.get(product) + 1);
currentProductSet.add(product);
}
}
productSet.removeAll(currentProductSet);
}
}
}
System.out.println(productCountMap);
“`
此段代码展示了一种方式来处理产品数据,使用集合和映射来跟踪前几条记录中的产品。
输出:{A=2, B=3}
获取到最新商品详情,统计第2和第3的商品,存 threeProductSet 以及计算器集合 threeProductMap 中。为了统计连续性,使用 currentThreeProductSet 存当天的商品信息,再和前面的商品交集,交集的数据就是有连续性商品数据。总结商品榜单需要根据不同的统计维度、参数、统计时间来设计商品榜单表结构。再根据配置的信息,生成榜单详情信息。一般都使用定时方式生成榜单详情信息。需要统计连续霸榜天数,一般有两种方式,一种是统计榜首的连续天数,另一种是前三的连续天数。统计榜首首先获取最新的榜首商品,商品往前找,连续性的找到前面的数据,如果非连续性就查找结束。统计前三排除了榜首之外,就是统计第2和第3的商品。获取最新的商品并记录,往前遍历,使用 set 的存储每次遍历的商品,在使用集合的交集来保证统计的连续性。
创业项目群,学习操作 18个小项目,添加 微信:80709525 备注:小项目!
如若转载,请注明出处:https://www.ya58.com/26997.html