簡體   English   中英

在Scala中使用foreach查找最大值

[英]Find maximum using foreach in Scala

我有一些實現def foreach(f: MyType => Unit): Unit集合。

MyType具有成員val value: Int在正常情況下, val value: Int大於或等於零。

我coud如何找到最大元素value使用foreach

UPD:

MyType應該有方法def max: MyType MyType實現此邏輯。

可穿越

您可以實現scala.collection.Traversable然后可以使用maxBy方法(以及Traversable所有其他方法):

import scala.collection.Traversable

case class MyType(value: Int)
class MyCollection {
  def foreach(f: MyType => Unit): Unit = Seq(MyType(3), MyType(5), MyType(2)) foreach f
}

implicit class MyCollectionTraversable(c: MyCollection) extends Traversable[MyType] {
  override def foreach[U](f: MyType => U): Unit = c.foreach{e => f(e); ()}
}

用法:

new MyCollection().maxBy{_.value}
// MyType = MyType(5)

您還可以像這樣添加隱式Ordering[MyType]

import scala.math.Ordering
implicit val myTypeOrd = Ordering.by{ (_: MyType).value }

new MyCollection().max
// MyType = MyType(5)

定制方法

您也可以手動添加自定義方法max ,但即使在這種情況下, MyCollectionTraversable也會很有用:

class MyCollectionTraversable(c: MyCollection) extends Traversable[MyType] {
  override def foreach[U](f: MyType => U): Unit = c.foreach{e => f(e); ()}
}

implicit class MyCollectionHelper(val c: MyCollection) extends AnyVal {
  def max: MyType = new MyCollectionTraversable(c).maxBy{_.value}
}

用法:

new MyCollection().max
// MyType = MyType(5)

首先,要解決這個問題:我認為foreach不是解決此特定問題的正確方法。 由於它沒有返回值,因此產生結果的唯一方法是副作用/易變性,這在Scala中通常被視為要避免的事情。 您可能應該研究reducefold方法,或它們專門的minmax ...版本。

如果您確實打算使用foreach ,則需要將閉包傳遞給foreach以更新在其作用域之外維護的免費max變量。

這是袖手旁觀,但應該可以:

def max: MyType = {
    var max = MyType(0)
    foreach {t =>
        if(t.value > max) max = t.value
    }
    max
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM