package com.qxueyou.scc.admin.progress.service.impl;
|
|
|
/**
|
* ѧϰ½ø¶È¹¤¾ß¼ÆËãÀà
|
*
|
* @author xiadehu
|
*
|
*/
|
public class StudyProgressUtils {
|
|
private final static int POS_BEFORE = 0;
|
|
private final static int POS_IN = 1;
|
|
private final static int POS_AFTER = 2;
|
|
/**
|
* еÄѧϰ½ø¶ÈºÍÔÓнø¶ÈºÏ²¢¹²ÓÐÁùÖֺϲ¢¶¯×÷
|
*/
|
private final static int ACTION_INSERT = 0;
|
|
private final static int ACTION_MERGE_01 = 1;
|
|
private final static int ACTION_MERGE_02 = 2;
|
|
private final static int ACTION_MERGE_11 = 3;
|
|
private final static int ACTION_MERGE_12 = 4;
|
|
private final static int ACTION_CONTINUE = 5;
|
|
/**
|
* ºÏ²¢Ñ§Ï°½ø¶È
|
*
|
* @param orig
|
* ÒÑѧϰ½ø¶È
|
* @param start
|
* ¿ªÊ¼Î»ÖÃ
|
* @param end
|
* ½áÊøÎ»ÖÃ
|
* @return
|
*/
|
public static Double[][] merge(Double[][] orig, Double start, Double end) {
|
|
// ÖмäºÏ²¢½á¹û
|
Double[][] result = new Double[orig.length + 1][2];
|
|
int j = 0;
|
int i = 0;
|
boolean breakFlag = false;
|
|
// ÖðÒ»¶Ô±ÈÅжÏÒÑÓÐѧϰ½ø¶È
|
for (; i < orig.length; i++) {
|
|
int action = action(orig[i], start, end);
|
|
switch (action) {
|
case ACTION_INSERT: {
|
result[j++] = new Double[] { start, end };
|
result[j++] = orig[i];
|
breakFlag = true;
|
break;
|
}
|
case ACTION_MERGE_01: {
|
result[j++] = new Double[] { start, orig[i][1] };
|
breakFlag = true;
|
break;
|
}
|
case ACTION_MERGE_02:
|
break;
|
case ACTION_MERGE_11: {
|
result[j++] = orig[i];
|
breakFlag = true;
|
break;
|
}
|
case ACTION_MERGE_12: {
|
start = orig[i][0];
|
break;
|
}
|
case ACTION_CONTINUE: {
|
result[j++] = orig[i];
|
break;
|
}
|
}
|
|
if (breakFlag) {
|
break;
|
}
|
}
|
|
// Ìí¼ÓÔÓÐѧϰ½ø¶ÈµÄÊ£Óಿ·Ö
|
for (i++; i < orig.length; i++) {
|
result[j++] = orig[i];
|
}
|
|
// Èç¹û±¾´ÎѧϰÖÕֹλÖó¬³öÒÔÍùËùÓÐѧϰ½ø¶È£¬ÔòÌí¼Óµ½×îºó
|
if (orig.length == 0 ) {
|
result[j++] = new Double[] { start, end };
|
}else if(pos(end, orig[orig.length - 1]) == POS_AFTER){
|
result[j++] = new Double[] { start, end };
|
}
|
|
// ×îÖպϲ¢½á¹û£¬È¥µôÖмäºÏ²¢½á¹ûµÄ¶à³öΪ¿ÕµÄÔªËØ
|
Double[][] finalResult = new Double[j][2];
|
|
for (int k = 0; k < result.length; k++) {
|
if (result[k][0] == 0 && result[k][1] == 0 && k>0) {
|
break;
|
}
|
finalResult[k] = result[k];
|
}
|
|
return finalResult;
|
|
}
|
|
/**
|
* ͳ¼ÆÑ§Ï°½ø¶È
|
*
|
* @param orig
|
* È«²¿Ñ§Ï°½ø¶È
|
* @return
|
*/
|
public static Double sum(Double[][] orig) {
|
|
Double sum = 0.0;
|
|
for (Double[] item : orig) {
|
sum += (item[1] - item[0] + 1);
|
}
|
return sum;
|
|
}
|
|
private static int action(Double[] segment, Double start, Double end) {
|
int startPos = pos(start, segment);
|
int endPos = pos(end, segment);
|
|
if (POS_BEFORE == endPos) {
|
return ACTION_INSERT;
|
}
|
|
if (POS_BEFORE == startPos && POS_IN == endPos) {
|
return ACTION_MERGE_01;
|
}
|
|
if (POS_BEFORE == startPos && POS_AFTER == endPos) {
|
return ACTION_MERGE_02;
|
}
|
|
if (POS_IN == startPos && POS_IN == endPos) {
|
return ACTION_MERGE_11;
|
}
|
|
if (POS_IN == startPos && POS_AFTER == endPos) {
|
return ACTION_MERGE_12;
|
}
|
|
if (POS_AFTER == startPos) {
|
return ACTION_CONTINUE;
|
}
|
|
return 0;
|
|
}
|
|
private static int pos(Double index, Double[] range) {
|
if (index < range[0]) {
|
return POS_BEFORE;
|
}
|
if (index >= range[0] && index <= range[1]) {
|
return POS_IN;
|
}
|
return POS_AFTER;
|
}
|
|
|
|
}
|