2010-04-28 13 views
6

我想實現一個基於HashMap的樹,將支持O(1)子樹查找給定的根密鑰。爲了這個目標,我想做到以下幾點:斯卡拉:圍繞「非法循環參考」

scala> type Q = HashMap[Char, Q] 
<console>:6: error: illegal cyclic reference involving type Q 
     type Q = HashMap[Char, Q] 
         ^

所以現在的問題是,有沒有辦法爲我做了類似的東西,而不訴諸醜陋HashMap[Char, Any]一起HashMap[Char, Any]數值的連續鑄造?

現在,我也看到我可以使用類似於以下的內容來避免循環引用錯誤,它甚至可能更清晰 - 但它很好找出如何正確地以第一種方式執行它,只是爲了教育的價值。

import collections.mutable.HashMap 

class LTree { 
    val children = new HashMap[Char, LTree] 
} 

謝謝你一堆。

+1

你能澄清你想要定義什麼樣的結構嗎?一棵樹的圓弧標有一個「Char」,並且它的節點根本沒有任何信息?如果是這樣的話,你的'LTree'儘可能小,儘管如你所寫,你只能創建空樹,因爲'children'和HashMap'一樣是不可變的,而構造函數沒有參數。 – 2010-04-28 21:21:18

+0

感謝您的評論Randall。我剛剛調整了上面的列表來指示(因爲它在我的源代碼中)所使用的HashMap是可變的。 用例確實是一個帶有char標籤的邊和不含任何信息的節點的有向圖。這實際上是一個基本的DFA,其葉節點隱含地被視爲最終狀態。 無論如何,上述內容與scala語法問題無關 - 我想我給出的一小段代碼是一種解決方法,我只是很好奇,是否有辦法更簡潔地做到這一點,就像在第一個列表中建議。 – 2010-04-28 22:19:00

+0

實際上,當然,使用'LTree'的第二種方法更合適,因爲我可以在各種樹操作中折騰其內的字段和成員函數。 – 2010-04-28 22:19:51

回答

16

我可能沒有「得到」的問題,而是怎麼樣

class L { 
    type Q = java.util.HashMap[Char, this.type] 
} 

class Q extends java.util.HashMap[Char, Q] 
+0

謝謝Artem!這兩個工作,這正是我所期待的。 Спасибо! :) – 2010-05-09 00:12:15

+7

然後將其標記爲正確! – Zasz 2011-09-08 17:13:35

+1

你能解釋第一個嗎? – 2014-03-19 01:58:02

1

對於類型不能extend,如Either,你也可以使用一個簡單包裝:

class MyEither(get: Either[String, MyEither]) 

或者,與的遞歸樹(的東西,使我這個線程):

// represents (validation) errors for a tree structure of nested dictionaries 
type FieldName = String 
type Error = String 

type Errors = List[(FieldName, FieldError)] 
case class FieldError(val get: Either[Error, Errors]) 

這是這個僞代碼的類型,合法的版本:

type Error = String 
type Errors = List[(FieldName, Either[Error, Errors])] 

然後,所有Left(...)Right(...)電話將成爲FieldError(Left(...))和分別爲FieldError(Right(...)),例如FieldError(Right(x)).get == Right(x)