【问题标题】:Unique maximum element of Scala listScala列表的唯一最大元素
【发布时间】:2018-11-08 06:35:18
【问题描述】:

我希望使用带有 Scala 的 apache flink 执行一个 max 函数,如果它是唯一的,则返回最大元素,否则返回 -1。为了更好地理解,下面有一个例子:

2list[1, 2, 1] 的函数的返回值。

-1list[3, 3, 1] 的函数的返回值,因为最大值结果为 3,但在此最大值列表中不是唯一的外观。

我认为我可以通过将所有元素放在一个 seq 上来做到这一点,但是在使用 flink 之后这将不起作用,所以我尝试使用 reduce,但我没有成功:/

有人可以帮忙吗?

【问题讨论】:

    标签: scala apache-flink


    【解决方案1】:

    使用 Flink API 折叠列表。从 (0, 0) 的元组开始。第一个是迄今为止的最大数字,第二个是您找到该数字的次数。

    当您找到一个大于元组_1 的数字x 时,您将创建一个元组(x, 0)。如果您发现一个小于 x 的数字,则忽略。如果你找到一个等于 x 的数字,则增加元组的 _2。

    在折叠结束时,您将有一个元组,即 (x, y),其中 x 是最大数字,y 是您找到该数字的次数。

    一个简单的 if 条件将如何帮助您返回 x 或 -1。

    编辑:Flink 已弃用折叠功能。使用 AggregateFunction 遍历列表。

    https://ci.apache.org/projects/flink/flink-docs-master/api/java/org/apache/flink/api/common/functions/AggregateFunction.html

    【讨论】:

      【解决方案2】:

      这应该可以解决您的问题

       val x: List[Int] = ???
       val grouped: Map[Int, List[Int]] = x.groupBy(identity)
       val uniqueElements:List[Int] = grouped.filter( _._2.size == 1 ).map(_._1).toList
       val maxVal = if(uniqueElements.isEmpty ) -1 else uniqueElements.max
      

      【讨论】:

      • 他是在 flink 里做的。不是常规的 scala 集合。
      • 哦,好吧。我的解决方案没有帮助:(
      猜你喜欢
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2019-03-25
      • 2011-05-23
      相关资源
      最近更新 更多