Beispiel #1
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="baseList">Of the element you want to sort an array。baseListはインデックス順に並んでいることを前提とする</param>
        /// <param name="solver">Interface is used to retrieve the parent elements</param>
        public HierarchicalOrderCollection(T[] baseList, HierarchicalOrderSolver <T> solver)
        {
            Queue <int>   cachedQueue = new Queue <int>();   //to queue the parent order from the baseList
            HashSet <int> cachedSet   = new HashSet <int>(); //To check the element containing the hash set

            cachedSet.Add(-1);
            while (cachedQueue.Count != baseList.Length)
            {
                foreach (var element in baseList)
                {
                    int index  = solver.getIndex(element);
                    int parent = solver.getParentIndex(element);
                    if (cachedSet.Contains(parent) && !cachedSet.Contains(index))
                    {//If the parent element is already included
                        cachedQueue.Enqueue(index);
                        cachedSet.Add(index);
                    }
                }
            }
            while (cachedQueue.Count != 0)
            {
                Add(baseList[cachedQueue.Dequeue()]);
            }
        }
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="baseList">ソートしたい要素の配列。baseListはインデックス順に並んでいることを前提とする</param>
        /// <param name="solver">親要素の取得などに使われるインターフェース</param>
        public HierarchicalOrderCollection(T[] baseList, HierarchicalOrderSolver <T> solver)
        {
            Queue <int>   cachedQueue = new Queue <int>();   //baseListから親の順に格納するキュー
            HashSet <int> cachedSet   = new HashSet <int>(); //格納された要素をチェックするためのハッシュセット

            cachedSet.Add(-1);
            while (cachedQueue.Count != baseList.Length)
            {
                foreach (var element in baseList)
                {
                    int index  = solver.getIndex(element);
                    int parent = solver.getParentIndex(element);
                    if (cachedSet.Contains(parent) && !cachedSet.Contains(index))
                    {//もし、親要素がすでに含まれていたとしたら
                        cachedQueue.Enqueue(index);
                        cachedSet.Add(index);
                    }
                }
            }
            while (cachedQueue.Count != 0)
            {
                Add(baseList[cachedQueue.Dequeue()]);
            }
        }