user2708013
user2708013

Reputation: 417

remove all negative elements from an array buffer of integers in scala

I have a question about coding. There are similar types of questions in the database which I came across but none of them clears my doubt. I am going thru the book of "Scala for Impatient". The code below removes negative elements from the Array and gives positive elements as output

val a = ArrayBuffer(-1, 1, 0, -2, -1, 2, 5, 6, 7)
val positionsToKeep = for (i <- a.indices if a(i) >= 0) yield i
for (j <- positionsToKeep.indices) a(j) = a(positionsToKeep(j))
a.trimEnd(a.length - positionsToKeep.length)

It gives the output as (1,0,2,5,6,7) removing all negative elements. I am unable to understand line 3 & 4.

for (j <- positionsToKeep.indices) a(j) = a(positionsToKeep(j))
a.trimEnd(a.length - positionsToKeep.length)

I'm scratching my head since 2 days on these 2 lines but can't give up and I finally posting it here seeking some help.

Upvotes: 0

Views: 456

Answers (1)

Raman Mishra
Raman Mishra

Reputation: 2686

As a is a bufferArray so we can change the values of the array a.

Line 3:

Line 3 is populating or you can say updating the value of positionToKeep into a.

a(j) = positionToKeep(j)
// which is running like this 
// a(0) = positionToKeep(0)
// a(1) = positionToKeep(1) .... and so on 

Now what will happen after populating all the values of positionToKeep into a there might be the case some older values remains untouched. Line four is deleting or dropping these elements. In the case when we have all the positive values in array a line four has like no use but when the length of a is greater then positionToKeep then we need line 4.

Line 4: consider the scenario

  1. val a = Array(1, 2, 3, 4, 5, 6)

    Then our positionToKeep will have all the element and the length of both the array will be equal.

    val positionToKeep = Array(1, 2, 3, 4, 5, 6)
    

    In this case line four trimEnd(0) because length of a and positionToKeep are equal.

  2. val a = Array( 1, 2, 3, 4, -5, -6, 8, 9, -3)

    In this case we will have Array(1,2,3,4,8,9) in positionToKeep

In line 3 we will update array a and after updating before line four this is how our array a will look like. Array(1,2,3,4,8,9,8,9,-3) as we need values only up to length 6 as we have only 6 positive values. We need to drop last 3 element that what is tripEnd doing for us.

Upvotes: 1

Related Questions