2015-11-04 37 views
1

我去努力創造自己的一類,其中我有一個equals方法,它定義了該分區組沒有大小== 1套裝,包含返回匹配,而不是布爾

的等價關係

這個類需要一個絕對路徑和一個根(也是一個路徑),如果它們的路徑相對於它們的根是相同的,那麼這些「相對路徑」是等價的。我有兩套這些內容,並且我確保每個單獨集合中的所有元素具有相同的根。所以,按照我的邏輯應該在==在第一組的任何元素的第二組是一個或零元素(S()。

但現在我意識到,我沒有很好的O(1 )查找我想要的,因爲Set.contains()方法只返回一個布爾值,而不是它找到的元素!!有沒有方法或集合我不知道這會給我O(1)行爲,我正在尋找對於(即一個O(1)查找等於,返回相等的元素)

回答

2

重新定義平等意味着別的東西,而不是所有元素的平等幾乎總是一個壞主意,斯卡拉集假設如果兩件事情是平等的,他們是可以互換的,這是不是在你的方法的情況下。

我想你將不得不使用Map [T,T]而不是Set [T]來做你想做的事。

+0

我想我定義了一個比大多數編程語言所期望的更平等的數學定義。最後,我最終創建了一個從第一組域到第二組域的翻譯功能,然後使用包含它也給了我想要的行爲!謝謝。 – Imran

+0

下面是等式的一個數學定義:*給定任意x和y,x = y如果給定任何謂詞P,P(x)當且僅當P(y)。*。如果您排除某個類的某些字段的平等性,那麼找到並非如此的P是非常容易的。 –

+0

我的意思是說,當然,這種關係與分區獨特的等價關係有關。之前我從來沒有在編程文獻中真正看到這種平等的定義。通常情況下,等於合同的條件恰好是等價關係所要求的條件。有趣的是,鑑於這種情況,如果沒有更強的條件,你也不可能期望所有的收藏品都能以最佳方式表現出來。 – Imran

2

這肯定已經問過,但即便如此,我無法找到它。

還有就是API在這裏一個洞,據我所看到的。

也許希望有人可以做得更好,但我能找到的最好的解決方法是:

def lookup[T](s: Set[T], x: T): Option[T] = 
    s.intersect(Set(x)).headOption 

讓我們把它兜風。首先定義一個類的情況下攜帶額外的信息並不影響平等:

scala> case class C(x: Int)(val y: Int) 
defined class C 

scala> C(3)(5) == C(3)(6) 
res4: Boolean = true 

現在讓我們嘗試一個測試用例:

scala> val s = Set(C(3)(5), C(8)(2), C(7)(6)) 
s: scala.collection.immutable.Set[C] = Set(C(3), C(8), C(7)) 

scala> lookup(s, C(8)(99)).map(_.y) 
res6: Option[Int] = Some(2) 

看起來不錯。

至於是否是O(1),在我看來,從細讀https://github.com/scala/scala/blob/2.11.x/src/library/scala/collection/immutable/HashSet.scala它。

+1

從2.11開始O(1)。我爲s.c.i.HashSet提高了Set/Set操作的效率。 –

相關問題