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