示例#1
0
        /**
         * @see <a href="http://en.wikipedia.org/wiki/Sweep_line_algorithm">Sweep line algorithm</a>
         */
        private void SweepCleanColumns(CT_Cols cols, CT_Col[] flattenedColsArray, CT_Col overrideColumn)
        {
            List <CT_Col>        flattenedCols   = new List <CT_Col>(flattenedColsArray);
            TreeSet <CT_Col>     currentElements = new TreeSet <CT_Col>(CTColComparator.BY_MAX);
            IEnumerator <CT_Col> flIter          = flattenedCols.GetEnumerator();
            CT_Col         haveOverrideColumn    = null;
            long           lastMaxIndex          = 0;
            long           currentMax            = 0;
            IList <CT_Col> toRemove = new List <CT_Col>();
            int            pos      = -1;

            //while (flIter.hasNext())
            while ((pos + 1) < flattenedCols.Count)
            {
                //CTCol col = flIter.next();
                pos++;
                CT_Col col = flattenedCols[pos];

                long currentIndex = col.min;
                long colMax       = col.max;
                long nextIndex    = (colMax > currentMax) ? colMax : currentMax;
                //if (flIter.hasNext()) {
                if ((pos + 1) < flattenedCols.Count)
                {
                    //nextIndex = flIter.next().getMin();
                    nextIndex = flattenedCols[pos + 1].min;
                    //flIter.previous();
                }
                IEnumerator <CT_Col> iter = currentElements.GetEnumerator();
                toRemove.Clear();
                while (iter.MoveNext())
                {
                    CT_Col elem = iter.Current;
                    if (currentIndex <= elem.max)
                    {
                        break; // all passed elements have been purged
                    }
                    toRemove.Add(elem);
                }

                foreach (CT_Col rc in toRemove)
                {
                    currentElements.Remove(rc);
                }

                if (!(currentElements.Count == 0) && lastMaxIndex < currentIndex)
                {
                    // we need to process previous elements first
                    CT_Col[] copyCols = new CT_Col[currentElements.Count];
                    currentElements.CopyTo(copyCols);
                    insertCol(cols, lastMaxIndex, currentIndex - 1, copyCols, true, haveOverrideColumn);
                }
                currentElements.Add(col);
                if (colMax > currentMax)
                {
                    currentMax = colMax;
                }
                if (col.Equals(overrideColumn))
                {
                    haveOverrideColumn = overrideColumn;
                }
                while (currentIndex <= nextIndex && !(currentElements.Count == 0))
                {
                    NPOI.Util.Collections.HashSet <CT_Col> currentIndexElements = new NPOI.Util.Collections.HashSet <CT_Col>();
                    long currentElemIndex;

                    {
                        // narrow scope of currentElem
                        CT_Col currentElem = currentElements.First();
                        currentElemIndex = currentElem.max;
                        currentIndexElements.Add(currentElem);

                        while (true)
                        {
                            CT_Col higherElem = currentElements.Higher(currentElem);
                            if (higherElem == null || higherElem.max != currentElemIndex)
                            {
                                break;
                            }
                            currentElem = higherElem;
                            currentIndexElements.Add(currentElem);
                            if (colMax > currentMax)
                            {
                                currentMax = colMax;
                            }
                            if (col.Equals(overrideColumn))
                            {
                                haveOverrideColumn = overrideColumn;
                            }
                        }
                    }

                    //if (currentElemIndex < nextIndex || !flIter.hasNext()) {
                    if (currentElemIndex < nextIndex || !((pos + 1) < flattenedCols.Count))
                    {
                        CT_Col[] copyCols = new CT_Col[currentElements.Count];
                        currentElements.CopyTo(copyCols);
                        insertCol(cols, currentIndex, currentElemIndex, copyCols, true, haveOverrideColumn);
                        //if (flIter.hasNext()) {
                        if ((pos + 1) < flattenedCols.Count)
                        {
                            if (nextIndex > currentElemIndex)
                            {
                                //currentElements.removeAll(currentIndexElements);
                                foreach (CT_Col rc in currentIndexElements)
                                {
                                    currentElements.Remove(rc);
                                }
                                if (currentIndexElements.Contains(overrideColumn))
                                {
                                    haveOverrideColumn = null;
                                }
                            }
                        }
                        else
                        {
                            //currentElements.removeAll(currentIndexElements);
                            foreach (CT_Col rc in currentIndexElements)
                            {
                                currentElements.Remove(rc);
                            }
                            if (currentIndexElements.Contains(overrideColumn))
                            {
                                haveOverrideColumn = null;
                            }
                        }
                        lastMaxIndex = currentIndex = currentElemIndex + 1;
                    }
                    else
                    {
                        lastMaxIndex = currentIndex;
                        currentIndex = nextIndex + 1;
                    }
                }
            }
            SortColumns(cols);
        }