|
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Найти ближайшего общего предка
Всем привет!
Столкнулся с проблемой. Имею несколько экземпляров (пусть для примера из будет 2) - наследников одного общего класса. При этом они могут принадлежать к одному классу-наследнику, а могут к разным. Как найти их ближайшего общего предка, если цепочка наследования включает 3-4 уровня? Головой понимаю, что задача элементарная, но вот как написать, не могу сообразить.
__________________
Не сломано - не чини! |
|
|||||
__________________
местонахождение |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Спасибо.
Вот такое решение по итогу получилось. Работает. public static function getNearestSharedAncestor (heirs: Array, TopClass: Class) : String // Ищет и возвращает имя ближайшего общего класса полученных наследников { var tree: Dictionary = new Dictionary(); if (!heirs.length) return null; for each (var heir: * in heirs) { if (!(heir is TopClass)) throw (CLASS_DEBUG_NAME + "-> getNearestSharedAncestor: полученные наследники не принадлежат общему классу " + getQualifiedClassName (TopClass)); if (getDefinitionByName (getQualifiedClassName (heir)) == TopClass) return getQualifiedClassName (heir); var HeirClass: Object = getDefinitionByName (getQualifiedClassName (heir)); var heritageChain: Vector.<String> = new Vector.<String>; while (HeirClass != TopClass) { heritageChain.push (getQualifiedClassName (HeirClass)); HeirClass = getDefinitionByName (getQualifiedSuperclassName (HeirClass)) } heritageChain.push (getQualifiedClassName (HeirClass)); tree[heir] = heritageChain; } var minLength: uint = tree[heirs[0]].length; for each (heir in heirs) if (tree[heir].length < minLength) minLength = tree[heir].length; for each (heir in heirs) { while (tree[heir].length > minLength) { tree[heir].shift(); } } var result: String; while (!result) { if (toCut) for each (heir in heirs) tree[heir].shift(); var item2test: String = tree[heirs[0]][0]; var toCut: Boolean = false; for each (heir in heirs) if (tree[heir][0] != item2test) toCut = true; if (!toCut) result = item2test; } return (result); }
__________________
Не сломано - не чини! |
|
|||||
скобка и так экранирует "слово" от чего-либо, зачем еще скобку экранировать пробелом непонятно ;( чем меньше в коде лишнего(пробелов, скобок и т.д.) тем проще его читать и понимать
__________________
местонахождение |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Объясни, пожалуйста. В каком месте?
__________________
Не сломано - не чини! |
|
|||||
но
- тут не хватает скобок throw (CLASS_DEBUG_NAME + "-> getNearestSharedAncestor: полученные наследники не принадлежат общему классу " + getQualifiedClassName (TopClass)); - разная стилистика : - наверное имеет смысл создавать словарь только если if не отработал Добавлено через 1 минуту Цитата:
Добавлено через 4 минуты сначала проверяем переменную toCut и только потом декларируем ее
__________________
местонахождение |
|
|||||
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
|
Большое спасибо. Всё принял к сведению.
__________________
Не сломано - не чини! |
Часовой пояс GMT +4, время: 03:56. |
|
« Предыдущая тема | Следующая тема » |
|
|