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; } }