001 package net.sf.cpsolver.exam.reports;
002
003 import java.util.Comparator;
004
005 import net.sf.cpsolver.exam.model.Exam;
006 import net.sf.cpsolver.exam.model.ExamRoomPlacement;
007
008 /**
009 * Compare two rooms by size. Either normal seating size or
010 * alternative sating size is used, based on the given exam (see
011 * {@link Exam#hasAltSeating()}.
012 * <br><br>
013 *
014 * @version
015 * ExamTT 1.1 (Examination Timetabling)<br>
016 * Copyright (C) 2008 Tomáš Müller<br>
017 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
018 * Lazenska 391, 76314 Zlin, Czech Republic<br>
019 * <br>
020 * This library is free software; you can redistribute it and/or
021 * modify it under the terms of the GNU Lesser General Public
022 * License as published by the Free Software Foundation; either
023 * version 2.1 of the License, or (at your option) any later version.
024 * <br><br>
025 * This library is distributed in the hope that it will be useful,
026 * but WITHOUT ANY WARRANTY; without even the implied warranty of
027 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
028 * Lesser General Public License for more details.
029 * <br><br>
030 * You should have received a copy of the GNU Lesser General Public
031 * License along with this library; if not, write to the Free Software
032 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
033 */
034 public class ExamRoomComparator implements Comparator {
035 private boolean iAsc;
036 private Exam iExam;
037
038 /**
039 * Constructor
040 * @param exam exam for which rooms are to be compared
041 */
042 public ExamRoomComparator(Exam exam, boolean asc) {
043 iExam = exam;
044 iAsc = asc;
045 }
046
047 /**
048 * Compare two rooms based on their normal/alternative seating size
049 */
050 public int compare(Object o1, Object o2) {
051 ExamRoomPlacement r1 = (ExamRoomPlacement)o1;
052 ExamRoomPlacement r2 = (ExamRoomPlacement)o2;
053 int cmp = (iAsc?1:-1)*Double.compare(r1.getSize(iExam.hasAltSeating()),r2.getSize(iExam.hasAltSeating()));
054 if (cmp!=0) return cmp;
055 return r1.getRoom().compareTo(r2.getRoom());
056 }
057 }