2015-11-02 81 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你基本上定義一個具有單個實例(單例模式)的類。這顯然不是你想要的。