For example:
[1,2,3,4,5] becomes [3,5,7,9]
You can accomplish this in Scala using the List class and its functions, these include:
- zip : this function takes an input list and creates a list of tuples with each mapping pair, discarding jagged values.
- tail : this function returns a list minus the first element of the list on which tail is performed.
- foldLeft : combines the elements of the list together with a seed value (in my case I use a target List).
- reverse : reverses the order of the list.
object SumPairs extends Application {
val numbers = List(1,2,3,4,5);
val result = numbers.zip(numbers.tail)
.foldLeft(List[Int]()) (
(list, y) => {
y._1 + y._2 :: list
}
)
.reverse;
println(result);
}
Basically this works as follows:
- I create a List of Tuples of each adjacent value in the List by getting the tail of the List.
- I get each Tuple in the list, sum it and prepend it to the List returned by "foldLeft".
- I reverse the List to fix the order as a result of doing a prepend.
BTW the challenge I'm talking about can be found here.
UPDATE:
Another solution would be to use List.flatMap which basically takes a function which returns an Iterable and appends it to a function, it pretty similar, It's maybe a little more concise, I'll let you decide:
val numbers = List(1,2,3,4,5);
numbers.zip(numbers.tail).flatMap {
value => {
List(value._1+value._2);
}
};
4 comments:
scala> val nums = 1::2::3::4::5::Nil
nums: List[Int] = List(1, 2, 3, 4, 5)
scala> nums.zip(nums.tail).map{ case(x,y) => x+y }
res0: List[Int] = List(3, 5, 7, 9)
scala>
scala> val nums = List.range(1,6)
nums: List[Int] = List(1, 2, 3, 4, 5)
scala> for((x,y) <- nums zip nums.tail) yield x+y
res0: List[Int] = List(3, 5, 7, 9)
Or just map
numbers.zip(numbers.tail).map {
case (a,b) => a + b
}
Use foldRight instead of foldLeft+reverse. Note that reverse is a specialisation of foldLeft and that any foldRight can be written using 2 foldLefts.
foldRight really shines when used across a lazy data structure (though scala.Stream's foldRight is broken).
Post a Comment