Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 具有现有密钥的NoTouchElementException_Scala_Hashmap_Nosuchelementexception - Fatal编程技术网

Scala 具有现有密钥的NoTouchElementException

Scala 具有现有密钥的NoTouchElementException,scala,hashmap,nosuchelementexception,Scala,Hashmap,Nosuchelementexception,建筑类别: class Building(val name: String, val skill: String, @volatile var workHours: Int) { var workers = new HashMap[Artisan, Int]() def doWork(worker: Artisan): Boolean = { ... workers.get(worker) match { case Some(i: Int) =>

建筑类别:

class Building(val name: String, val skill: String, @volatile var workHours: Int) {

  var workers = new HashMap[Artisan, Int]()

  def doWork(worker: Artisan): Boolean = {
    ...
    workers.get(worker) match {
      case Some(i: Int) =>
        worker.cash += i
        true
      case None => false
    }
    ...
  }
工匠阶级:

class Artisan(val skill: String, city: City) extends Player(skill, city) {
  var assignment = new Building("Empty", "", 0)

  def doWork() {
    if ( !assignment.doWork(this) )
    ...
  }

  def canEqual(other: Any): Boolean = other.isInstanceOf[Artisan]

  override def equals(other: Any): Boolean = other match {
    case that: Artisan =>
      (that canEqual this) &&
        assignment == that.assignment &&
        skill == that.skill
    case _ => false
  }

  override def hashCode(): Int = {
    val state = Seq(assignment, skill)
    state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b)
  }
}
测试用例:

@Test
def testIncome() {
  val building = new Building("Bakery", "Builder", 10)
  building.setSallery(100, player)  // add player to building hashmap
  player.assignment = building
  player.doWork()
  assertEquals("Should earn 100", player.cash, 100)
}
输出:

Negative test case

我不明白这段代码实际上是如何提供这个错误的。如果元素不存在,我的代码应该返回false。通过调试程序,Artisan对象被添加到我的hashmap中,因此我不明白它为什么会失败。

Scala不鼓励使用
返回。您的错误消息看起来好像整个函数都得到了计算,即使有返回语句。在您这样的情况下,
return
有两种选择:

1) 使用选项

var workers = new HashMap[Artisan, Int]()

  def doWork(worker: Artisan): Boolean = {
    val maybeIncome = workers.get(worker)
    maybeIncome match {
        case None => false
        case Some(income) => {
          val result = <do something with income that returns Boolean>
          result
         }
       }
    }
var-workers=newhashmap[Artisan,Int]()
def doWork(工人:工匠):布尔={
val maybeIncome=workers.get(worker)
可能是比赛{
case None=>false
案例部分(收入)=>{
val结果=
结果
}
}
}
2) 用于理解

var workers = new HashMap[Artisan, Int]()

  def doWork(worker: Artisan): Boolean = {
    val result = for { income <- workers.get(worker) } yield {
      <do something with income that returns boolean>
    }
    result getOrElse false
  }
var-workers=newhashmap[Artisan,Int]()
def doWork(工人:工匠):布尔={

val结果=用于{income您的
Artisan
类是什么样子的?您正在使用
equals
查看辅助密钥是否在集合中,但是
apply
方法正在使用
==
,它只调用
equals
,尽管如果您重写它,可能会导致问题。您可以使用
contains
方法检查
映射是否
包含一个键,即
!workers.contains(worker)
。我有另一个使用
键集的测试用例。存在(u.equals(worker)))
。这不会给出相同的结果吗?正如@Noah所说,看看你的
Artisan
类会很有趣。对我来说,这看起来像是你的
equals
hashCode
方法之间的不匹配。我看到
Artisan
类内部有变量。不确定使用这样的类作为键有多大意义理论上,像
doWork
这样的方法应该返回新对象,而不是修改现有对象等。尽管这是对我的空点错误的一个很好的回应,但它无助于解决我的理解。Now.get(worker)结果变为无,即使调试程序时显示元素按预期放置在hashmap中。这真的很奇怪。
get
的语义是,当键不存在且
Some(值)时,它返回
None
,当键存在时。您的
Artisan
类外观如何?或者,更好的是,您可以显示一些使用
doWork
的调用代码吗?另一件事:您的
工作者
是一个
变量
。您可能应该尝试使用可变映射吗?除此之外,您可以打印出所有
工作者
键吗在你的
doWork
函数的入口?这可能会有一些启发。哎哟,你正在使用具有可变元素的类作为键。这是自找麻烦。你能设计一个不可变的键吗?我将尝试编辑用于hashkey的变量,而只使用vals。我完成后会再次更新代码。