【问题标题】:In a list of objects how do I subtract a field of one object with the same field of another object in the same List in Scala?在对象列表中,如何在 Scala 的同一个列表中减去一个对象的字段与另一个对象的相同字段?
【发布时间】:2021-05-27 02:21:29
【问题描述】:

我有以下案例类:

case class AgeDiff(serviceLocation: ServiceLocation, daysBehind: Option[Long])
case class ServiceLocation(
    environment: String,
    service: String,
    pool: String,
    region: String
)

我有一个List[AgeDiff]

对于serviceLocation,此列表中只有两种可能的环境

QA & Prod

列表的示例可能是:

val ageDiffList = List(
    AgeDiff(
      ServiceLocation("qa", "a-service", "poolC", "us-west-4"),
      Some(6)
    ),
    AgeDiff(
      ServiceLocation("prod", "a-service", "poolC", "us-west-4"),
      Some(7)
    ),AgeDiff(
      ServiceLocation("qa", "b-service", "poolC", "us-west-4"),
      Some(8)
    ),
    AgeDiff(
      ServiceLocation("prod", "b-service", "poolC", "us-west-4"),
      Some(10)
    )
)

我想返回一个新的List[AgeDiff],我从所有在prod 中具有serviceLocation 的AgeDiff 中减去serviceLocationqa 中的serviceLocation

例如,当列表减法发生时,它将如下所示:

val ageDiffList = List(
    AgeDiff(
      ServiceLocation("qa", "a-service", "poolC", "us-west-4"),
      Some(6)
    ),
    AgeDiff(
      ServiceLocation("prod", "a-service", "poolC", "us-west-4"),
      Some(1)

    ),AgeDiff(
      ServiceLocation("qa", "b-service", "poolC", "us-west-4"),
      Some(8)
    ),
    AgeDiff(
      ServiceLocation("prod", "b-service", "poolC", "us-west-4"),
      Some(2)
    )
)


条件是:

  • 我想对同一个pool的AgeDiffs做减法, region,service.

例如:

   AgeDiff(
      ServiceLocation("qa", "a-service", "poolC", "us-west-4"),
      Some(6)
    ),
    AgeDiff(
      ServiceLocation("prod", "a-service", "poolC", "us-west-4"),
      Some(7)
    )

不是

   AgeDiff(
      ServiceLocation("qa", "a-service", "poolC", "us-west-4"),
      Some(6)
    ),
    AgeDiff(
      ServiceLocation("prod", "b-service", "poolC", "us-west-4"),
      Some(7)
    )
  • 如果同一服务中的天数不同, 不要减去

例如:

   AgeDiff(
      ServiceLocation("qa", "a-service", "poolb", "us-west-3"),
      Some(6)
    ),
    AgeDiff(
      ServiceLocation("prod", "a-service", "poolC", "us-west-4"),
      Some(7)
    )

除非他们有相同的游泳池、地区和服务,或者他们落后比赛几天,否则他们可能会被折叠。但是,服务名称必须相同才能减去。

  • 如果 daysBehindNone 则不要比较并保持原样

【问题讨论】:

  • 因此,如果列表只有environment"qa",或者如果列表具有所有唯一的service 值,则不会有任何变化。对吗?
  • 是的,没错
  • 如果列表以"qa" 条目开头,后跟7 个匹配的"prod" 条目,减法会发生一次(第一个"prod")还是7 次?
  • 7 次,因为区域可能不同,它们也可以包含不同的 daysBehind 值。
  • 如果daysBehind中有Nones怎么办?

标签: list scala object


【解决方案1】:

好的,规格仍然有点模糊,但我会尝试一下。

val newADList =
  ageDiffList.foldLeft((List[AgeDiff](),Map[ServiceLocation,Long]())){
    case ((acc, mp)
         ,ad@AgeDiff(sl@ServiceLocation("qa",_,_,_),less)) =>
      (ad::acc, mp+(sl.copy(environment="prod") -> less.getOrElse(0L)))
    case ((acc, mp)
         ,ad@AgeDiff(sl@ServiceLocation("prod",_,_,_),Some(x))) =>
      (ad.copy(daysBehind = Some(x - mp.getOrElse(sl,0L)))::acc, mp)
    case ((acc, mp), ad) => (ad::acc, mp)
  }._1.reverse

这假定daysBehinddaysBehind 值为None"qa" 忽略,而是有效地关闭所有后续"prod" 元素中的减法匹配SeviceLocation 值。

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多