将 Iterable.sliding 输出为元组

发布于 2024-10-12 14:51:01 字数 416 浏览 2 评论 0原文

集合上的方法 slidingX[Iterable[A]] 的形式返回给定大小的滑动窗口,其中 X 是集合类型,A 是元素类型。通常我需要两个或三个元素,并且我更喜欢给它们命名。 sliding(2) 的一个丑陋的解决方法如下:

points.sliding(2).foreach{ twoPoints =>
      val (p1,p2) = (twoPoints.head,twoPoints.last)
      //do something
}

这很糟糕并且仅适用于两个元素。另请注意,这

(a,b) = (twoPoints(0),twoPoints(1))

不起作用。

The method sliding on collections returns a sliding window of given size in the form of X[Iterable[A]] with X being the type of the collection and A the element type. Often I need two or three elements and I prefer to have them named. One ugly workaround for sliding(2) is the following:

points.sliding(2).foreach{ twoPoints =>
      val (p1,p2) = (twoPoints.head,twoPoints.last)
      //do something
}

This sucks and only works for two elements. Also note that

(a,b) = (twoPoints(0),twoPoints(1))

doesn't work.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

时光倒影 2024-10-19 14:51:01

我在 这个 上周就回答了。

points.sliding(2).foreach { case X(p1, p2) => ... }

如果 pointsArray,则将 X 替换为 Array。如果是List,则将X替换为List,依此类推。

请注意,您正在进行模式匹配,因此您需要使用 {} 而不是参数的 ()

I did a lot of that in this answer just last week.

points.sliding(2).foreach { case X(p1, p2) => ... }

If points is an Array, then replace X with Array. If it is a List, replace X with List, and so on.

Note that you are doing a pattern match, so you need to {} instead of () for the parameter.

甜心小果奶 2024-10-19 14:51:01

twoPoints 看起来是一个列表。试试这个:

points.sliding(3).foreach{ _ match {
  case Seq(a, b, c) => {
      //do something
  }
}

你会惊讶地发现什么样的功夫模式匹配可以让你侥幸逃脱。

twoPoints would appear to be a List. Try this:

points.sliding(3).foreach{ _ match {
  case Seq(a, b, c) => {
      //do something
  }
}

You'll be surprised what sorts of kung fo pattern matching lets you get away with.

单挑你×的.吻 2024-10-19 14:51:01

我最近想在滑动迭代器中添加更多糖分,所以我想出了这个:

implicit class SlidingOps[A](s: Seq[A]) {
  def slidingPairs = (s, s.tail).zipped
  def slidingTriples = (s, s.tail, s.tail.tail).zipped
}

这适用于任何 Seq,但对于 List 可能最有效。 .zipped 返回 scala.runtime.Tuple2Zipped (或 Tuple3Zipped(用于 3 元素元组)对象,它定义了几个熟悉的高阶方法,以便它们的参数采用多个参数,因此您可以编写:

points.slidingPairs.foreach { (a, b) => ... }

甚至:

(1 to 10).slidingTriples.map(_ + _ + _)

您可以优化如果您希望它对非列表类型真正有效,请进一步实现。

I recently wanted a little more sugar in my sliding iterators, so I came up with this:

implicit class SlidingOps[A](s: Seq[A]) {
  def slidingPairs = (s, s.tail).zipped
  def slidingTriples = (s, s.tail, s.tail.tail).zipped
}

This works with any Seq, but is probably most efficient with List. .zipped returns a scala.runtime.Tuple2Zipped (or Tuple3Zipped for a 3-element tuple) object, which defines several familiar higher-order methods so that their arguments take multiple arguments, so you can write:

points.slidingPairs.foreach { (a, b) => ... }

or even:

(1 to 10).slidingTriples.map(_ + _ + _)

You can optimize the implementation further if you want it to be really efficient for non-list types.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文