001package org.cpsolver.coursett.model;
002
003import java.util.ArrayList;
004import java.util.HashSet;
005import java.util.List;
006import java.util.Set;
007
008/**
009 * Student group.
010 * 
011 * @author  Tomáš Müller
012 * @version CourseTT 1.3 (University Course Timetabling)<br>
013 *          Copyright (C) 2006 - 2016 Tomáš Müller<br>
014 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
015 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
016 * <br>
017 *          This library is free software; you can redistribute it and/or modify
018 *          it under the terms of the GNU Lesser General Public License as
019 *          published by the Free Software Foundation; either version 3 of the
020 *          License, or (at your option) any later version. <br>
021 * <br>
022 *          This library is distributed in the hope that it will be useful, but
023 *          WITHOUT ANY WARRANTY; without even the implied warranty of
024 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
025 *          Lesser General Public License for more details. <br>
026 * <br>
027 *          You should have received a copy of the GNU Lesser General Public
028 *          License along with this library; if not see
029 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
030 */
031public class StudentGroup implements Comparable<StudentGroup> {
032    private long iId;
033    private String iName;
034    private double iWeight;
035    private List<Student> iStudents = new ArrayList<Student>();
036    
037    /**
038     * Create a student group
039     * @param id group unique id
040     * @param weight group weight
041     * @param name group name
042     */
043    public StudentGroup(long id, double weight, String name) {
044        iId = id; iName = name; iWeight = weight;
045    }
046    
047    /**
048     * Returns student group id
049     */
050    public long getId() { return iId; }
051    
052    /**
053     * Returns student group name
054     */
055    public String getName() { return iName; }
056    
057    /**
058     * Returns student group weight
059     */
060    public double getWeight() { return iWeight; }
061    
062    /**
063     * Return students of this group
064     */
065    public List<Student> getStudents() {
066        return iStudents;
067    }
068    
069    /**
070     * Count students of this group that are requesting the given offering.
071     * @param offeringId offering id
072     * @return students with {@link Student#hasOffering(Long)} true
073     */
074    public int countStudents(Long offeringId) {
075        int ret = 0;
076        for (Student student: iStudents)
077            if (student.hasOffering(offeringId)) ret++;
078        return ret;
079    }
080    
081    /**
082     * Add student to this group
083     * @param student a student to add
084     */
085    public void addStudent(Student student) {
086        iStudents.add(student);
087    }
088    
089    @Override
090    public int hashCode() { return (int)(iId ^ (iId >>> 32)); }
091    
092    @Override
093    public boolean equals(Object o) {
094        return (o != null && o instanceof StudentGroup && getId() == ((StudentGroup)o).getId());
095    }
096    
097    @Override
098    public String toString() {
099        return getName();
100    }
101
102    @Override
103    public int compareTo(StudentGroup g) {
104        int cmp = getName().compareToIgnoreCase(g.getName());
105        if (cmp != 0) return cmp;
106        return (getId() < g.getId() ? -1 : getId() == g.getId() ? 0 : 1);
107    }
108    
109    /**
110     * Average enrollment weight of students of this group in the given offering
111     */
112    public double getAverageEnrollmentWeight(Long offeringId) {
113        double total = 0.0; int count = 0;
114        for (Student student: iStudents)
115            if (student.hasOffering(offeringId)) {
116                total += student.getOfferingWeight(offeringId);
117                count ++;
118            }
119        return count == 0 ? 0.0 : total / count;
120    }
121    
122    /**
123     * Count offerings that students of this group have
124     */
125    public int countOfferings() {
126        Set<Long> offeringIds = new HashSet<Long>();
127        for (Student student: iStudents)
128            offeringIds.addAll(student.getOfferings());
129        return offeringIds.size();
130    }
131}