หน้าเว็บ

วันพฤหัสบดีที่ 12 ธันวาคม พ.ศ. 2556

integrate period algorithm : javascript

บทความนี้เป็นการแปลง code จากบทความที่แล้ว (integrate period algorithm : java) ให้มาเป็น javascript ครับ

สิ่งที่นำไปประยุกต์ใช้
การ highlight keyword ที่เกิดการเหลื่อมกัน ระหว่างคำ https://github.com/jittagornp/index-search-javascript/blob/master/src/main/webapp/indexsearch.js


Utils.js
function empty(list) {
    return list === null || list.length === 0;
}

function notEmpty(list) {
    return !empty(list);
}

function isUndefined(object) {
    return typeof object === 'undefined';
}

function defined(object) {
    return !isUndefined(object);
}

function notDefined(object) {
    return isUndefined(object);
}
Period.js
/**
 * @author jittagorn pitakmetagoon
 * create 12/12/2013
 * 
 * document : http://na5cent.blogspot.com/2013/12/integrate-period-algorithm-java.html
 */
var Period = function(start, end) {
    var start__ = start;
    var end__ = end;

    this.getStart = function() {
        return start__;
    };

    this.getEnd = function() {
        return end__;
    };

    this.setStart = function(start) {
        start__ = start;
    };

    this.setEnd = function(end) {
        end__ = end;
    };

    this.equals = function(object) {
        if (object.getStart() === start__ && object.getEnd() === end__) {
            return true;
        }

        return false;
    };

    this.toString = function() {
        return 'period {' + start__ + ', ' + end__ + '}';
    };
};
PeriodIntegrator.js
/**
 * @author jittagorn pitakmetagoon
 * create 12/12/2013
 * 
 * document : http://na5cent.blogspot.com/2013/12/integrate-period-algorithm-java.html
 */
var PeriodIntegrator = function() {

    var periodSet__ = {};
    var periodList__;

    function getPeriodKey(period) {
        return period.getStart() + ':' + period.getEnd();
    }

    this.addPeriod = function(period) {
        var periodKey = getPeriodKey(period);
        if (notDefined(periodSet__[periodKey])) {
            periodSet__[periodKey] = period;
        }

        return this;
    };

    this.addAllPeriods = function(periodList) {
        if (notEmpty(periodList)) {
            for (var index in periodList) {
                this.addPeriod(periodList[index]);
            }
        }

        return this;
    };

    function toPeriodList() {
        var list = [];
        for (var index in periodSet__) {
            list.push(periodSet__[index]);
        }

        return list;
    }

    function sortPeriods() {
        periodList__ = toPeriodList();
        showPeriods("initial periods", periodList__);

        periodList__ = periodList__.sort(function(period1, period2) {
            if (period1.getStart() === period2.getStart()) {
                return period1.getEnd() - period2.getEnd();
            }

            return period1.getStart() - period2.getStart();
        });

        showPeriods("step 1 >> sort periods", periodList__);
    }

    function changeOverlap() {
        if (periodList__.length > 1) {
            for (var i = 1; i < periodList__.length; i++) {
                var before = periodList__[i - 1];
                var current = periodList__[i];

                if (current.getStart() < before.getEnd()) {
                    current.setStart(before.getEnd());
                }
            }
        }

        showPeriods("step 2 >> change overlap", periodList__);
    }

    function removePeriod(period) {
        for (var index in periodList__) {
            if (periodList__[index].equals(period)) {
                delete periodList__[index];
            }
        }
    }

    function removeIncorrect() {
        if (periodList__.length > 1) {
            for (var i = 1; i < periodList__.length; i++) {
                var periodI = periodList__[i];
                for (var j = i + 1; j < periodList__.length; j++) {
                    var periodJ = periodList__[j];
                    
                    if (defined(periodI) && defined(periodJ) && (isIncorrect(periodJ) || isSubPeriod(periodJ, periodI))) {
                        removePeriod(periodJ);
                    }
                }
            }
        }

        showPeriods("step 3 >> remove incorrect", periodList__);
    }

    function isIncorrect(period) {
        return period.getStart() >= period.getEnd();
    }

    function isSubPeriod(period1, period2) {
        return period1.getStart() >= period2.getStart() && period1.getEnd() <= period2.getEnd();
    }

    function integratePeriods() {
        if (periodList__.length > 1) {
            for (var i = 1; i < periodList__.length; i++) {
                var before = periodList__[i - 1];
                var current = periodList__[i];

                if (defined(current) && defined(before) && current.getStart() === before.getEnd()) {
                    current.setStart(before.getStart());
                    removePeriod(before);
                    i--;
                }
            }
        }

        showPeriods("step 4 >> integrate periods", periodList__);
    }

    function showPeriods(operationName, periodList) {
        console.log('');
        console.log(operationName);
        console.log('---------------------------------------------------------');

        for (var index in periodList) {
            var period = periodList[index];
            console.log(period.toString());
        }
    }

    this.integrate = function() {
        sortPeriods();
        changeOverlap();
        removeIncorrect();
        integratePeriods();

        return periodList__;
    };
};
IntegratePeriodAlgorithm.html
<!DOCTYPE html>
<html>
    <head>
        <title>integrate period algorithm</title>
        <script type="text/javascript" src="Utils.js"></script>
        <script type="text/javascript" src="Period.js"></script>
        <script type="text/javascript" src="PeriodIntegrator.js"></script>
    </head>
    <body>
        <script type="text/javascript">
            new PeriodIntegrator()
                    .addPeriod(new Period(5, 30))
                    .addPeriod(new Period(15, 40))
                    .addPeriod(new Period(50, 65))
                    .addPeriod(new Period(50, 55))
                    .addPeriod(new Period(0, 20))
                    .addPeriod(new Period(70, 100))
                    .addPeriod(new Period(80, 85))
                    .addPeriod(new Period(85, 90))
                    .integrate();
        </script>
    </body>
</html>

ไม่มีความคิดเห็น:

แสดงความคิดเห็น