11

First day and first attempt at using Scala - so go easy on me! I'm trying to rewrite some old Java code I have which is simply a function which takes two numbers and prints out the numbers from x to y. For example, i have the increment function:

    def increment(start: Int, finish: Int) = {
      for (i <- start to finish) {
         println("Current value (increasing from "+start+" to "+finish+") is "+i)
      }
    }

However, im struggling writting a corresponding decrement function which will decrease from start to finish? I have read Scala downwards or decreasing for loop? but am still unsure

Thank you

8 Answers 8

18
scala>def decrement(start: Int, finish: Int) = {
    |  for (i <- start to finish by -1)
    |   println("Current value (decreasing from "+start+" to "+finish+") is "+i);
    | }
decrement: (start: Int,finish: Int)Unit

scala> decrement(10, 1)
Current value (decreasing from 10 to 1) is 10
Current value (decreasing from 10 to 1) is 9
Current value (decreasing from 10 to 1) is 8
Current value (decreasing from 10 to 1) is 7
Current value (decreasing from 10 to 1) is 6
Current value (decreasing from 10 to 1) is 5
Current value (decreasing from 10 to 1) is 4
Current value (decreasing from 10 to 1) is 3
Current value (decreasing from 10 to 1) is 2
Current value (decreasing from 10 to 1) is 1
Sign up to request clarification or add additional context in comments.

6 Comments

Perfect thanks. I now have no idea how i didnt see that from stackoverflow.com/questions/2617513/… Definitely not thinking straight!
One more thing - sorry. How would i get the value of the iterator in the println?
start to finish by -1 will return a Range which you can iterate over.
Is there anyway to write this function in functional form?
def dec(start: Int, finish: Int) = { start to finish by -1 }; dec(10, 1).foreach( i => println("decrementing " + i) );
|
6
for (i <- (6 to 3 by -1)) {println ("i: " + i)}
i: 6
i: 5
i: 4
i: 3

If you happen to forget by -1, you can move up and use a function, to revert the result:

for (i <- (3 to 6)) {println ("i: " + ((6+3) - i))}

To exclude the second boundary, use until:

for (i <- (6 until 3 by -1)) {println ("i: " + i)}
i: 6
i: 5
i: 4

Alternatively, you could define an Iterator for your purpose. Extending an Iterator is easy; just implement 'hasNext:Boolean' and 'Next:[T]', where T is the type to handle - in our case Int or maybe Long or BigInt:

class FromToIterator (start: Int, stop: Int) extends Iterator [Int] { 
  var current = start
  //                        3       6       3         6         6       3       6         3
  def hasNext : Boolean = ((start < stop && current <= stop) || (start > stop && current >= stop)) 
  def next: Int = { 
    val res = current
    if (start < stop) current += 1 else current -= 1
    res
  } 
}
val it = new FromToIterator (3, 6)
val ti = new FromToIterator (6, 3)

for (i <-it) println (i)
for (i <-ti) println (i)

Comments

2

This way you can use Decreasing for loop in Scala.

    object Example extends App {


      for(i <- 20 to 2 by -2){


        println("Value of i = "+ i)

      }
    }
------------------
O/P
------------------
Value of i = 20
Value of i = 18
Value of i = 16
Value of i = 14
Value of i = 12
Value of i = 10
Value of i = 8
Value of i = 6
Value of i = 4
Value of i = 2

Comments

1

highnum to lownum by -1 (switch with other negative or positive step to change stepping)

def decrement(start: Int, finish: Int) = {
  for (i <- start to finish by -1) {
     println("Current value (decreasing from "+start+" to "+finish+") is "+i)
  }
}

I think this is a dupe of Scala downwards or decreasing for loop?

Comments

0

Here is a global increment/decrement solution inspired by Scala downwards or decreasing for loop?:

def goThrough(start: Int, finish: Int) = {     
  val d = if(start<=finish) 1 else -1
  for (i <- start to finish by d) {
    println("Current value (increasing from "+start+" to "+finish+") is "+i)
  } 
}

Comments

0
object Test extends App{

  def decrement(start: Int, finish: Int,dec :Int) = {
    for (i <- Range(start,finish,dec)) {
      println("Current value (decreasing from "+start+" to "+finish+") is "+i)
    }
  }

  decrement(5,0,-1)
}

This is also a method. but may not be the best

Comments

0
def printInDecreasingOrder(start : Int, end : Int){
  if(start > end ){
     for(i <- start to end by -1){
       println(s"Current value (decreasing from $start to $end) is $i")
     }
   }else{
     println("first num is smaller than second")
   }
}

method call:

printInDecreasingOrder(10, 2)

Result:

Current value (decreasing from 10 to 2) is 10

Current value (decreasing from 10 to 2) is 9

Current value (decreasing from 10 to 2) is 8

Current value (decreasing from 10 to 2) is 7

Current value (decreasing from 10 to 2) is 6

Current value (decreasing from 10 to 2) is 5

Current value (decreasing from 10 to 2) is 4

Current value (decreasing from 10 to 2) is 3

Current value (decreasing from 10 to 2) is 2

printInDecreasingOrder(1, 10)

Result:

first num is smaller than second

Comments

0

A point to add to this answer, if you do something like this

for(j <- finish to start){......}

sbt does not even show the error. So if you want a decrementing for loop you need to do this

for(j <- finish to start by -1){.......}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.