⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 criticalpathalgorithmimpl.java

📁 It is all about project scheduling. GanttProject is a tool for creating a project schedule by means
💻 JAVA
字号:
 package net.sourceforge.ganttproject.task.algorithm;import java.util.ArrayList;import java.util.Enumeration;import java.util.Iterator;import java.util.List;import net.sourceforge.ganttproject.GanttCalendar;import net.sourceforge.ganttproject.calendar.GPCalendar;import net.sourceforge.ganttproject.task.Task;import net.sourceforge.ganttproject.task.TaskNode;import net.sourceforge.ganttproject.task.dependency.TaskDependency;/** * Algorithm to retrieve critical tasks. This algorithm starts from the last * tasks (the last to end) and go back to check if predecessors end is the same * as its starts. It is recursive. *  * @author bbaranne */public class CriticalPathAlgorithmImpl implements CriticalPathAlgorithm {    TaskNode root = null;    private GPCalendar calendar = null;    public CriticalPathAlgorithmImpl(TaskNode root, GPCalendar cal) {        this.root = root;        this.calendar = cal;    }    /**     * Returns a list of the last-ended tasks.     *      * @return A list of the last-ended tasks.     */    private List getLastTasks() {        List res = new ArrayList();        Enumeration en = this.root.preorderEnumeration();        GanttCalendar end = null;        while (en.hasMoreElements()) {            Object next = en.nextElement();             if(!(next instanceof TaskNode))                continue;            TaskNode tn = (TaskNode) next;            if (tn.isRoot())                continue;            GanttCalendar tnEnd = tn.getEnd();            if (end == null || end.before(tnEnd)) {                res.clear();                end = tnEnd.Clone();                res.add(tn.getUserObject());            } else if (end.compareTo(tnEnd) == 0)                res.add(tn.getUserObject());        }        return res;    }    /**     * Returns an array containing the critical tasks.     *      * @return An array containing the critical tasks.     */    public Task[] getCriticalTasks() {//        System.out.println("getCriticalTasks");        List lastTasks = getLastTasks();        List res = new ArrayList(lastTasks);//        System.out.println("lastTasks " + lastTasks);;        Iterator it = lastTasks.iterator();        while (it.hasNext()) {            Task t = (Task) it.next();            res.add(t);            checkCriticalTasks(t, res);        }        Task[] r = new Task[res.size()];        res.toArray(r);        return r;    }    /**     * Recursive method that adds critical task among predecessors of     * <code>successor</code> in <code>criticalTasksList</code>     *      * @param successor     *            The start task.     * @param criticalTasksList     *            The list in which critical tasks should be added.     */    private void checkCriticalTasks(Task successor, List criticalTasksList) {        TaskDependency[] rel = successor.getDependenciesAsDependant().toArray();        for (int i = 0; i < rel.length; i++) {            Task t = rel[i].getDependee();            if (t.getEnd().compareTo(successor.getStart()) == 0                    || isIntervalNonWorking(t.getEnd(), successor.getStart(),                            calendar)) {                criticalTasksList.add(t);                checkCriticalTasks(t, criticalTasksList);//                System.out.println("critical " + t);            }//            else//                System.out.println("non critical " + t);        }    }    private static boolean isIntervalNonWorking(GanttCalendar d1,            GanttCalendar d2, GPCalendar cal) {        while (d1.before(d2)                && cal.getWeekDayType(d1.getDayWeek()) != GPCalendar.DayType.WORKING)            d1.add(1);        return d1.equals(d2);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -