/// <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()]); } }