2010-04-28 10 views
6

मैं एक हैश मैप-आधारित पेड़ को लागू करने की कोशिश कर रहा हूं जो किसी दिए गए रूट कुंजी के लिए ओ (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

क्या आप स्पष्ट कर सकते हैं कि आप किस प्रकार की संरचना को परिभाषित करना चाहते हैं? एक पेड़ जिसका चाप एक 'चार' के साथ लेबल किया गया है और जिनके नोड्स में कोई जानकारी नहीं है? यदि ऐसा है, तो आपका 'LTree' जितना कम हो जाता है उतना ही कम है, यद्यपि लिखा गया है कि आप केवल खाली पेड़ बना सकते हैं क्योंकि' बच्चों 'अपरिवर्तनीय है क्योंकि' हैश मैप 'स्वयं है और कन्स्ट्रक्टर को कोई तर्क नहीं होता है। –

+0

टिप्पणी रैंडल के लिए धन्यवाद। मैंने उपर्युक्त सूची को इंगित करने के लिए बस tweaked किया है (जैसा कि यह मेरे स्रोत कोड में है) कि हैश मैप इस्तेमाल किया जा सकता है। उपयोग केस वास्तव में एक निर्देशित ग्राफ है जिसमें चार लेबल वाले किनारों और नोड्स हैं जो किसी भी जानकारी को नहीं रखते हैं। यह वास्तव में एक प्राथमिक डीएफए है ​​जिसमें पत्ता-नोड्स को अंतिम रूप से अंतिम राज्य माना जाता है। किसी भी दर पर, उपरोक्त स्कैला वाक्यविन्यास के प्रश्न के लिए प्रासंगिक नहीं है - मुझे लगता है कि मैंने जो छोटा स्निपेट दिया है वह एक कामकाज है, मैं केवल उत्सुक था अगर इसे और अधिक संक्षेप में करने का कोई तरीका है, पहली लिस्टिंग में सुझाव दिया। –

+0

व्यावहारिक रूप से बोलते हुए, निश्चित रूप से, 'एलटीआरई' के साथ दूसरा तरीका अधिक उपयुक्त है क्योंकि मैं विभिन्न वृक्षों के लिए खेतों और सदस्य कार्यों में टॉस कर सकता हूं। –

उत्तर

16

मैं शायद सवाल है, लेकिन क्या

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

या

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

धन्यवाद आर्टम! इन दोनों कामों में, यह वही है जो मैं खोज रहा था। Спасибо! :) –

+7

फिर इसे सही के रूप में चिह्नित करें! – Zasz

+1

क्या आप पहले को समझा सकते हैं, कृपया? –

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)

संबंधित मुद्दे