list - Scala List.contains(x) 返回false,但exists(_.== x) 返回true

标签 list scala collections contains exists

我正在 Scala 中处理一些简单的数据结构和集合,我注意到我认为的奇怪行为。这是对象:

class State (protected val trackmap: Map[Int, List[String]]) {

  override def clone : State = {
    new State(Map() ++ trackmap)
  }

  override def toString = { "State: " + trackmap.toString }

  def equals (other: State) : Boolean = {
    //println("Comparing " + trackmap + " to " + other.trackmap)
    trackmap == other.trackmap  

  }

  def == (other: State) : Boolean = {
    this equals other
  }
}

和我的相关测试:
  test("state equality") {
    val state = new State( Map(1 -> List("engine"), 2 -> List("a"), 3 -> List("b")) )

    expect(true) { state equals state.clone }
    expect(true) { state == state.clone }
    expect(false) { state == new State(Map(1 -> List("a"))) }
    expect(false) { state equals new State(Map(1 -> List("a"))) }

    expect(true) { List(state).exists( _.equals (state.clone) )}
    expect(true) { List(state).exists( _.== (state.clone) )}
    expect(true) { List(state).contains( state.clone )}
  }

除了最后一个,我希望它应该通过。我没有看过 Scala 源代码,但我认为 contains 将基本上作为第二个存在调用来实现。

最佳答案

您没有覆盖 Scala 的实际 equals 方法,这就是它行为奇怪的原因。
像这样重新编写您的 equals 方法,事情应该可以正常工作:

override def equals (other: Any) : Boolean = {
    other match{
      case that: State =>
        //println("Comparing " + trackmap + " to " + other.trackmap)
        trackmap == that.trackmap
      case _ => false
    }
}

看,Scala 中的 equals 方法采用 Any not State 类型的参数,您需要添加 override它的关键字。

顺便说一句,您甚至不需要 == 方法,因为 Scala 会自动将其重新映射为 equals 方法!

关于list - Scala List.contains(x) 返回false,但exists(_.== x) 返回true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15282847/

相关文章:

python - 试图找到元素较少的列表

java - 如何实现排序列表

scala - Scala 中 Select 语句中的 Math.abs 函数

Python:测试一个值是否存在于 defaultdict 列表中

java - 不同大小列表的交集

python - 我怎样才能使用冒号(:) in variable

c++ - 对 C++ 对列表进行排序

scala - 使用查询参数测试 Play Controller

java - 如何在 Scala 中获取字符串的最后一个元音及其后面的任何单词?

java - 使用 Comparator 和 Arrays.asList() 进行排序