2015-11-02 52 views
0

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

的Java方法:

在java中我只创建一个自定义类,覆盖散列和平等的方法在自定义类,我会做。

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

斯卡拉方式(Scala的新手):

Introduction to Sets and Maps for Scala

在这里,我很困惑一个特点,类和对象之间进行选择。显然,在第一次看,我不能有特性和类分配给var/val(请让我知道,如果上述可以完成)。所以对象是要走的路。

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

问题1: 我应该如何定义自定义(类/特征/对象)HashSet的?

普通HashSet的申报史卡拉:var hSet = new HashSet();

问题2: 如何值分配给新的对象?例如,

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

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

谢谢

+1

最简单也是最常用的方法是对你的元素使用'case class'。 – dmitry

+0

我是斯卡拉新手。谢谢,我会查找它。 – kingspp

回答

1

简短的回答是:Scala的方式是一样的Java的方式。也就是说,case类可以通过自动构造一个有效的hash和equals方法来帮助你(对于这个问题,toStringapply)。它是这样的:

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

请注意,HashSets具有类型参数,就像在Java中一样。对于不可变集合,语法会有所不同,但是从Java中提供这个会更容易。

此外,当你定义一个object你基本上定义一个具有单个实例(单例模式)的类。这显然不是你想要的。