在 Scala 中定义自定义 HashSet?

Define custom HashSet in Scala?

基本上我有三个变量a、b和c。变量之间有一定的关系。我需要将变量存储在一个 HashSet 中,这样每个变量都会不同并且不会有任何冗余。

Java方式:

在 java 中,我只是创建一个自定义 class,重写该自定义 class 中的散列和相等方法,然后我就完成了。

HashSet<CustomClass> hSet = new HashSet<CustomClass>();

Scala 之道(Scala 新手):

Introduction to Sets and Maps for Scala

这里我在 trait , class 和 object 之间做出选择感到困惑。显然,乍一看我不能将 trait 和 class 分配给 var / val(如果可以完成上述操作,请告诉我)。所以对象是要走的路。

object State {
    var a: Int;
    var b: Int;
    var c: Int;
}

问题 1: 我应该如何定义自定义 (class/trait/object) HashSet?

Scala 中的普通 HashSet 声明:var hSet = new HashSet();

问题二: 如何给新对象赋值?例如,

var newState = State;
newState.a = 100;
hSet.add(newState);

错误:类型不匹配;发现:需要 Int(100):Int.type

谢谢

简短的回答是:Scala 方式与 Java 方式相同。也就是说,case classes 可以通过自动构建有效的散列和 equals 方法(以及 toStringapply 来帮助您)。它是这样的:

case class MyClass(myInt: Int, myString: String)
val hSet = new mutable.HashSet[MyClass]();
hSet += MyCLass(2, "foo") 

请注意,HashSet 具有类型参数,就像 Java 中一样。对于不可变集,语法略有不同,但从 Java 开始,这会感觉更容易。

此外,当您定义 object 时,您基本上是在用单个实例(单例模式)定义 class。这显然不是你想要的。