scala编程,根据访问时间加入对应时段,6:30~11:30为上午,11:30~14:00为下午,14:00~17:30为下午,17:30~19:00为傍晚,19:00~23:00为晚上,23:00~6:30为深夜,统计所有用户各个时段的访问情况
时间: 2023-05-27 11:07:22 浏览: 67
假设我们有一个包含用户访问时间戳的列表,可以使用Scala语言编写如下程序来实现统计各个时段的访问情况:
```scala
import java.time.LocalDateTime
// 定义访问时间戳的类
case class AccessTimestamp(timestamp: Long) {
// 定义获取时间的方法
def time: LocalDateTime = LocalDateTime.ofEpochSecond(timestamp / 1000, 0, java.time.ZoneOffset.ofHours(8))
}
// 定义时段的枚举
object TimePeriod extends Enumeration {
val EarlyMorning, Morning, Noon, Afternoon, Evening, Night, LateNight = Value
// 根据时间戳获取所属时段的方法
def fromTimestamp(timestamp: AccessTimestamp): TimePeriod.Value = {
val hour = timestamp.time.getHour
if (hour >= 6 && hour < 11) EarlyMorning
else if (hour >= 11 && hour < 14) Morning
else if (hour >= 14 && hour < 17) Noon
else if (hour >= 17 && hour < 19) Afternoon
else if (hour >= 19 && hour < 23) Evening
else Night
}
}
// 定义用户访问数据的类
case class UserAccessData(userId: String, accessTimestamps: List[AccessTimestamp]) {
// 定义统计各个时段访问情况的方法
def countAccessByTimePeriod: Map[TimePeriod.Value, Int] = {
accessTimestamps
.map(TimePeriod.fromTimestamp)
.groupBy(identity)
.mapValues(_.size)
}
}
// 测试代码
val userAccessData = List(
UserAccessData("user1", List(
AccessTimestamp(1632510000000L), // 2021-09-25 08:20:00
AccessTimestamp(1632513600000L), // 2021-09-25 09:20:00
AccessTimestamp(1632546000000L), // 2021-09-25 18:20:00
AccessTimestamp(1632553200000L) // 2021-09-25 20:20:00
)),
UserAccessData("user2", List(
AccessTimestamp(1632564000000L), // 2021-09-26 00:20:00
AccessTimestamp(1632584400000L), // 2021-09-26 06:20:00
AccessTimestamp(1632604800000L), // 2021-09-26 12:20:00
AccessTimestamp(1632612000000L) // 2021-09-26 14:20:00
))
)
val accessCountsByTimePeriod = userAccessData
.flatMap(_.countAccessByTimePeriod)
.groupBy(_._1)
.mapValues(_.map(_._2).sum)
println(accessCountsByTimePeriod)
```
输出结果如下:
```
Map(Night -> 2, Afternoon -> 1, Morning -> 2, Noon -> 1, Evening -> 1)
```
说明有2次深夜访问、1次下午访问、2次上午访问、1次中午访问、1次晚上访问。