कक्षाओं के संग्रह को देखते हुए, निकटतम सामान्य सुपरक्लास खोजने का सबसे अच्छा तरीका क्या है?कक्षाओं के संग्रह के निकटतम सामान्य सुपरक्लास (या सुपरइंटरफेस) को ढूंढना
उदाहरण के लिए, निम्न में दिया:
interface A {}
interface B {}
interface AB extends A, B {}
interface C {}
class AImpl implements A {}
class ABImpl implements AB {}
class ABImpl2 implements A, B {}
class BCImpl implements B, C {}
मैं निम्नलिखित (व्यापक नहीं) उम्मीद करेंगे:
commonSuperclass(A, AImpl) == A
commonSuperclass(A, B, C) == Object or null, I'm not picky
commonSuperclass(A, AB) == A
commonSuperclass(AImpl, ABImpl) == A
commonSuperclass(ABImpl, ABImpl2) == either A or B or both, I'm not picky
commonSuperclass(AImpl, ABImpl, ABImpl2) == A
commonSuperclass(ABImpl, ABImpl2, BCImpl) == B
commonSuperclass(AImpl, ABImpl, ABImpl2, BCImpl) == Object
मैं कल्पना मैं अंत में इस बाहर काम कर सकता था, लेकिन किसी को यह पहले से ही हल किया जाना चाहिए Arrays.asList(...)
में टाइप अनुमान जैसे चीजों के लिए। क्या कोई मुझे एल्गोरिदम, या बेहतर अभी तक कुछ मौजूदा उपयोगिता कोड पर इंगित कर सकता है?
ईटीए: मैं प्रतिबिंब API के बारे में पता है। यह एल्गोरिदम (या ऐसे एल्गोरिदम का कार्यान्वयन) है जिसे मैं ढूंढ रहा हूं।
ईटीए: और मुझे पता है कि यह एक डीएजी है। धन्यवाद। तुम बहुत चालाक हो
ईटीए: संस्थानिक छंटाई पर (फिर EJP's answer में): संस्थानिक तरह एल्गोरिदम मैं से परिचित हूँ आप की आवश्यकता करने के लिए या तो: कोई आवक के साथ "रूट" नोड्स n
से
- शुरू किनारों (यानी, इस परिदृश्य में, अनुमानतः
Object
और सुपरइंटरफेस के बिना सभी इंटरफेस - जिसे किसी को पूरे सेट की जांच करनी होगी, साथ ही सभी सुपरक्लास/सुपरइंटरफेस, एकत्र करने के लिए) और सभी किनारों को(n, m)
(यानी, सभीm extends/implements n
), फिर से जानकारी एक होगा ई इकट्ठा करने के लिए पूरे सेट की जांच करने के लिए), या कोई बाहर जाने वाले किनारों (यानी, इस परिदृश्य में, सभी वर्गों/इंटरफेसm
जिसके लिए कोई वर्गk extends/implements m
मौजूद है के साथ "पत्ता" नोड्सm
है, जो फिर से एक करने के लिए होगा से - शुरू एकत्र करने के लिए पूरे सेट की जांच करें) और सभी किनारों को
(n, m)
(यानी, सभी वर्ग/इंटरफेसm
विस्तार/कार्यान्वयन - हमारे पास कौन सी जानकारी है) को संसाधित करें।
यह संभव है कि इनमें से एक या अन्य बहु-पास एल्गोरिदम (ठीक है, अनुमानतः # 2) ऐसा करने का सबसे प्रभावी तरीका है, लेकिन यह निश्चित रूप से मामूली रूप से स्पष्ट नहीं है। यह भी पूरी तरह से संभव है कि एक-पास टोपोलॉजिकल सॉर्ट एल्गोरिदम है जिसे मैं परिचित नहीं हूं, या मुझे इन एल्गोरिदम को गलत मिला है, लेकिन उस मामले में, फिर से, "यह मूल रूप से एक प्रकार का स्थलीय प्रकार है" तुरंत नेतृत्व नहीं करता है उत्तर में एक।
काफी काम नहीं करता है: एबी और एबीआईएमपीएल दिया गया यह एबी के बजाय ए देता है। लेकिन सही रास्ते पर। –
मैंने तर्क को थोड़ा सा tweaked किया है, लगता है कि आपके सभी परीक्षण मामलों और एबी, एबीआईएमपीएल के लिए काम करता है। हालांकि मैं अभी भी पूरी तरह से खुश नहीं हूं। – Adam
अतिरिक्त मजबूत एस्प्रेसो + पूर्ण पुनर्लेखन, अंततः इसके साथ खुश। परीक्षण और परिणामों के साथ अद्यतन किया गया। मैंने ऐसा किया है, इसलिए यह सभी आम पूर्वजों को लौटाता है, यह ऐसी परिस्थितियों से संबंधित है जहां कई स्तर पर कई हैं। यदि आप निकटतम चाहते हैं, तो बस सूची में पहले चुनें। – Adam