HiveBrain v1.2.0
Get Started
← Back to all entries
patternMinor

Replacing a sequence of real numbers with another sequence

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
realwithnumberssequencereplacinganother

Problem

I have a simple task:


Given a sequence of real numbers, replace all of its members larger
than Z by Z and count the number of replacements.

I solved this task using Scala, but my code looks like imperative-style code. I want to make my code more functional. How can I rewrite my program so it becomes functional-style code?

def main(args : Array[String]) {
    println("Enter Z number: ")
    val z = readDouble();

    println("Enter the length of sequence: ")
    val lenght = readInt();

    var seq: List[Double] = List();

    // Filling sequence
    for (i  {if (x > z){substituteCount+= 1; z} else x})

    println("Replacement count: " + substituteCount)
    println("New sequence: " + seq.reverse.mkString(" "))
}

Solution

Let's split this up a bit; firstly, let's put the sequence filling code in its own function:

def populateSequence(length: Int): IndexedSeq[Double] = {
  for {
    i <- 1 to length
    _ = println("Enter sequence item ? " + i)
    item = readDouble()
  } yield item
}


This utilizes the a combination of for and yield - in this case, this returns an IndexedSeq[Double], but don't worry, you can treat this like a List (or simply convert it to one with a .toList if you really want to.

Our code structure then looks like this:

def main(args: Array[String]) {
  println("Enter Z number: ")
  val z = readDouble();

  println("Enter the length of sequence: ")
  val length = readInt();

  val seq = populateSequence(length)


Ok, where to from here? Well, in this case, instead of modifying substituteCount as we go, I'd rather just calculate it up front:

val substituteCount = seq count (_ > z)


To get our modified List (or IndexedSequence), we can use another for expression. Again, one thing to remember is that both for and if are expressions in Scala, so we can do this:

val modified = for {
  v  z) z else v
} yield item


We can then print everything as usual:

println("Replacement count: " + substituteCount)
println("New sequence: " + modified.mkString(" "))

Code Snippets

def populateSequence(length: Int): IndexedSeq[Double] = {
  for {
    i <- 1 to length
    _ = println("Enter sequence item ? " + i)
    item = readDouble()
  } yield item
}
def main(args: Array[String]) {
  println("Enter Z number: ")
  val z = readDouble();

  println("Enter the length of sequence: ")
  val length = readInt();

  val seq = populateSequence(length)
val substituteCount = seq count (_ > z)
val modified = for {
  v <- seq
  item = if (v > z) z else v
} yield item
println("Replacement count: " + substituteCount)
println("New sequence: " + modified.mkString(" "))

Context

StackExchange Code Review Q#26362, answer score: 3

Revisions (0)

No revisions yet.