Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

scala Range for Long

I'm new to the Scala language.

I need Range for Long type.

I need a List of [1, 2, 3 ... 10000000] with step 1. If I use until/to I get an error because of using Long instead of Int.

I try to write simple function which expects a start, an end and and an empty List and generates a List of [start .. end].

Here is my function:

def range_l(start : Long, end : Long, list : List[Long]) : List[Long] = {
    if (start == end){
        val add_to_list = start :: list
        return add_to_list
    }
    else {
        val add_to_list = start :: list
        range_l(start + 1, end, add_to_list)
    }
}

If I call it like: range_l(1L, 1000000L, List()) i get OutOfMemory error in the following line: add_to_list = start :: list

What can you advice me? How can I get Range[Long] or how can I optimize the function. How can I avoid OutOfMemory?

Thank you.

like image 294
0xAX Avatar asked May 09 '12 06:05

0xAX


1 Answers

You can create such a range by using the following syntax:

val range = 1L to 10000000L

The 'L' is mandatory to inform the compiler that the litterals are longs and not ints.

You can then use almost all List methods on the instance range. It should not fill you memory because the intermediate values are generated when needed. The range can be passed to any method expecting a Traversable[Long], a Seq[Long], an Iterable[Long], etc.

However, if you really need a List just call range.toList (and increase the heap size to accommodate all the list elements)...

like image 186
paradigmatic Avatar answered Oct 10 '22 00:10

paradigmatic