2010-04-28 17 views
6

Belirli bir kök anahtarı için O (1) alt ağacı aramasını destekleyen bir HashMap tabanlı ağaç çalıştırmaya çalışıyorum. Bu hedefe gerekirse, aşağıdakileri yapmaya çalışıyorum: Yani soru şuScala: "yasadışı döngüsel başvuru" nın çevresinde çalışan

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

, beni HashMap[Char, Any] için değerlerin müteakip döküm ile çirkin HashMap[Char, Any] başvurmadan tür bir şey yapmak için bir yol var ?

Ayrıca, döngüsel referans hatalarından kaçınmak için aşağıdaki gibi bir şeyleri kullanabileceğimi ve hatta daha temiz olabileceğini de görüyorum - ancak ilk adımda doğru şekilde nasıl yapılacağını öğrenmek güzel olurdu. Sadece eğitim değeri için.

import collections.mutable.HashMap 

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

Teşekkürler bir demet.

+1

Ne tür bir yapı tanımlamak istediğinizi açıklayabilir misiniz? Yayları bir "Char" ile etiketlenmiş ve düğümleri hiç bilgi taşımayan bir ağaç? Eğer öyleyse, “LTree” iniz en az olduğu kadarıyla yazılıyor, ancak yazılı olarak sadece boş ağaçlar yaratabilirsiniz, çünkü 'Çocuklar' HashMap'in kendisi gibi değişmez ve yapıcı hiçbir argüman almaz. –

+0

Yorum için teşekkürler Randall. Ben sadece HashMap'in kullanılıp kullanılamayacağını belirtmek için yukarıdaki listeyi değiştirdim (kaynak kodumda olduğu gibi). Kullanım durumu aslında char-etiketli kenarlara ve herhangi bir bilgi içermeyen düğümlere sahip yönlendirilmiş bir grafiktir. Aslında bu, kesin olarak nihai hal olarak kabul edilen yaprak düğümleri olan ilkel bir DFA'dır. Herhangi bir hızda, yukarıdaki scala sözdizimi sorusuyla alakalı değil - Sanırım verdiğim küçük snippet bir geçici çözüm, sanırım bunu daha da özlü bir şekilde yapmanın bir yolu var mı diye merak ettim ilk listede önerildi. –

+0

Pratik olarak, elbette, "LTree" ile ikinci yol, çeşitli ağaç operasyonları için alanlara ve üye fonksiyonlarına atlayabildiğimden daha uygundur. –

cevap

16

Muhtemelen değil extend, örneğin Either olarak, ayrıca bir de kullanabilirsiniz türleri için

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

veya

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

Teşekkürler Artem! Her ikisi de bu iş, tam da aradığım şey buydu. Спасибо! :) –

+7

O zaman doğru olarak işaretleyin! – Zasz

+1

İlkini açıklar mısınız lütfen? –

1

ilgili soruyu, ama ne "get" yok önemsiz sarıcı:

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

veyaile yinelemeli ağaç(bu konuya götürdü şey): Bu sözde kod tip-hukuki versiyonudur

// 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])] 

tüm Left(...) ve Right(...) aramalar FieldError(Left(...)) olacaktı, sonra ve FieldError(Right(...)), örn. FieldError(Right(x)).get == Right(x).