Layman
Layman

Reputation: 1056

Scala HashMap#contains expects Nothing

I am trying to use a Scala HashMap like below, and when I try to operate on the HashMap, I get type mismatches. Besides using Java HashMap, how can I write this?

import scala.collection.mutable._

object Solution {

  def twoSum(nums: Array[Int], target: Int): Array[Int] = {
    var lookupTable = new HashMap()

    for(i <- nums.indices) {
      if (lookupTable.contains(target - nums(i)))
        return Array(lookupTable(i), i)
      lookupTable.put(nums(i), i)
    }

    throw new Exception
  }
}

Upvotes: 1

Views: 176

Answers (1)

Levi Ramsey
Levi Ramsey

Reputation: 20611

In the absence of a type ascription, an empty HashMap is a HashMap[Nothing, Nothing], which, because mutable HashMaps are invariant means you have a collection which you can't put anything into or get anything out of.

There are thus two ways to fix this:

You can use a mutable HashMap[Int, Int]:

val lookupTable = HashMap[Int, Int]()

Alternatively, you can use an immutable HashMap, which is covariant in the value type and technically invariant in the key type, but there's a way around that:

var lookupTable = scala.collection.immutable.HashMap()

for (i <- nums.indices) {
  if (lookupTable.contains(target - nums(i))) return Array(lookupTable(i), i)
  else lookupTable = lookupTable ++ Seq((nums(i), i))
}

Upvotes: 5

Related Questions