Вопрос

Here is my solution, but I don't like it very much:

var seq1: Seq[String] = Seq("apple", "banana", "camel")
var seq2: Seq[(String, String)] = Seq( "green" -> "fruit", "yellow" -> "fruit", "brown" -> "animal" )
var iter = seq1.toIterator

seq2.map {s => (s._1, s._2, iter.next()) }
Это было полезно?

Решение

If you find yourself doing much of this kind of thing, the Shapeless library provides some really nice ways to work with tuples without giving up type safety.

For example, you could write the following using Shapeless's prepend operator for tuples (+:) and the standard library's zipped, which lets you avoid the creation of intermediate collections:

(seq1, seq2).zipped.map(_ +: _)

This is beautiful, type-safe, and for large collections it'll be more performant than solutions using zip.

You could of course also use zipped without Shapeless:

(seq1, seq2).zipped.map { case (a, (b, c)) => (a, b, c) }

Or:

(seq1, seq2).zipped.map((a, b) => (a, b._1, b._2))

In addition to the fact that this doesn't build an intermediate collection of tuples, the fact that map here takes a function of two arguments (instead of a function from tuples) can sometimes make the syntax a little cleaner (as you can see in the +: example above).

Другие советы

Simple:

scala> var seq1 = Seq("apple", "banana", "camel")
seq1: Seq[String] = List(apple, banana, camel)

scala> var seq2 = Seq("green" -> "fruit", "yellow" -> "fruit", "brown" -> "animal")
seq2: Seq[(String, String)] = List((green,fruit), (yellow,fruit), (brown,animal))

scala> seq1 zip seq2 map { case (s1, (s2, s3)) => (s1, s2, s3) }
res1: Seq[(String, String, String)] = List((apple,green,fruit), (banana,yellow,fruit), (camel,brown,animal))

Or:

seq2 zip seq1 map (x => (x._1._1, x._1._2, x._2))

using product-collections

seq2 flatZip seq1
res0: org.catch22.collections.immutable.CollSeq3[String,String,String] = 
CollSeq((green,fruit,apple),
        (yellow,fruit,banana),
        (brown,animal,camel))

A CollSeq3 is a collection that holds only Tuple3[A,B,C]s and is itself a Tuple3[Seq[A],Seq[B],Seq[C]].

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top