Last active
August 29, 2015 14:21
-
-
Save PabloVallejo/34d3c1d1907c3ecee454 to your computer and use it in GitHub Desktop.
Hospice project
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Import all Java utils. | |
import java.util.*; | |
// Improt java lang. | |
import java.lang.*; | |
// Excercises. | |
public class App { | |
// Main method | |
public static void main( String[] args ) { | |
// Instantiate the system. | |
ShiftSystem system = new ShiftSystem(); | |
// Start counting the time. | |
system.start(); | |
// Manual use case | |
// --------------------------- | |
// Create 3 nurses. | |
Nurse n1 = new Nurse(); | |
Nurse n2 = new Nurse(); | |
Nurse n3 = new Nurse(); | |
// Add first nurse. | |
system.addNurse(n1); | |
// Do things on time. | |
Timer timer = new Timer(); | |
// Add second nurse. | |
timer.schedule(new TimerTask() { | |
@Override | |
public void run() { | |
system.addNurse(n2); | |
} | |
}, 2000); | |
// Add third nurse. | |
timer.schedule(new TimerTask() { | |
@Override | |
public void run() { | |
system.addNurse(n3); | |
} | |
}, 4000); | |
// There are other methods that can be called. | |
// | |
// // Number of nurses in the hospice. | |
// system.nursesInHospice(); | |
// | |
// // Current nurse in turn. | |
// system.nurseInTurn(); | |
// | |
// // Time before a nurse is in turn. | |
// system.timeBeforeTurnIsOn(n1.getId()); | |
// | |
// // Occupy a nurse. | |
// // Occupies the nurse currently in turn. | |
// system.occupyNurse(); | |
// | |
// // Frees a nurse. | |
// system.freeNurse(); | |
// | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Import all Java utils. | |
import java.util.*; | |
// Improt java lang. | |
import java.lang.*; | |
// | |
// Hospice class. | |
// | |
public class Hospice { | |
/** | |
* Name | |
*/ | |
private String name; | |
/** | |
* PossibleNames to name the hospice randomly. | |
*/ | |
private String[] possibleNames = { | |
"Hospice Mavericks", | |
"Yosemite's Hospice", | |
"Hospice Leopard", | |
"Tiger's Hospice" | |
}; | |
/** | |
* Constructor. | |
*/ | |
public Hospice() { | |
// Name | |
Random rand = new Random(); | |
int min = 0; | |
int max = 2; | |
int i = rand.nextInt((max - min) + 1) + min; | |
name = possibleNames[i]; | |
} | |
/** | |
* String representation. | |
*/ | |
public String toString() { | |
return name; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Import all Java utils. | |
import java.util.*; | |
// Improt java lang. | |
import java.lang.*; | |
// Nurse class. | |
// | |
// Hours are counted from 0 to 24. | |
// | |
public class Nurse { | |
/** | |
* Id | |
*/ | |
private String id; | |
/** | |
* Whether this nurse is occupied with a pacient. | |
*/ | |
private boolean occupied = false; | |
/** | |
* Time in which the working day of | |
* this nurse finishes. | |
*/ | |
public int endOfWorkingDay; | |
/** | |
* Length of this nurse's turn in minutes. | |
* Default it to an hour. | |
*/ | |
private int turnDuration; | |
/** | |
* Time this nurse has left in turn. | |
*/ | |
private int remainingTimeInTurn; | |
/** | |
* Constructor. | |
*/ | |
public Nurse() { | |
// Generate a random id for this nurse. | |
this.id = UUID.randomUUID().toString(); | |
// Hours are counted from 0 to 24. | |
this.endOfWorkingDay = 1; | |
// Default turn duration to 10. | |
this.turnDuration = 10; | |
// Set remaining time in turn equal to `turnDuration`. | |
this.remainingTimeInTurn = this.turnDuration; | |
} | |
/** | |
* Returns nurse Id. | |
*/ | |
public String getId() { | |
return this.id; | |
} | |
/** | |
* Get end of working day in minutes. | |
*/ | |
public int getEndOfWorkingDay() { | |
return this.endOfWorkingDay * 60; | |
} | |
/** | |
* Occupies a nurse. | |
*/ | |
public boolean occupy() { | |
// Return false if this nurse is already occupied. | |
if (this.occupied) | |
return false; | |
this.occupied = true; | |
return true; | |
} | |
/** | |
* Checks if this nuerse is occupied. | |
*/ | |
public boolean occupied() { | |
return this.occupied; | |
} | |
/* | |
* Advances time on minute which means substracting one | |
* unit from `remainingTimeInTurn`. | |
*/ | |
public int advanceTime() { | |
this.remainingTimeInTurn -= 1; | |
return this.remainingTimeInTurn; | |
} | |
/** | |
* Reset reimaining time in | |
*/ | |
public void resetRemainingTime() { | |
this.remainingTimeInTurn = this.turnDuration; | |
} | |
/** | |
* How much time does this nurse have left in their turn. | |
*/ | |
public int timeLeftInTurn() { | |
return this.remainingTimeInTurn; | |
} | |
/** | |
* Checks whether this nurse has finished thier turn, | |
* Which means that they have `remainingTimeInTurn` as 0. | |
*/ | |
public boolean turnFinished() { | |
return this.remainingTimeInTurn <= 0; | |
} | |
/** | |
* Checks whether the working day of this nurse | |
* if off given a time in minutes. | |
*/ | |
public boolean isWorkingDayOff(int time) { | |
return time >= this.endOfWorkingDay * 60; | |
} | |
/** | |
* Nurse string representation. | |
*/ | |
public String toString() { | |
return "Nurse: " + this.id; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Import all Java utils. | |
import java.util.*; | |
// Improt java lang. | |
import java.lang.*; | |
// List of nurses. | |
// | |
// The list of nurses is actually an array list of `Nurse` objects | |
// but we're wrapping it on this class in order to call useful | |
// methods on it like adding a nurse to the list and others. | |
public class NursesList { | |
/** | |
* List of nurses in turn. | |
*/ | |
private ArrayList<Nurse> listOfNursesInTurn; | |
/** | |
* List of nurses in hospice. | |
*/ | |
private ArrayList<Nurse> listOfNurses; | |
/** | |
* Elapsed time in minutes | |
*/ | |
private int elapsedTime = 0; | |
/** | |
* Constructor. | |
*/ | |
public NursesList() { | |
// By default we're going to allow 200 nurses at most. | |
int listLength = 200; | |
// Initialize list of nurses and nurses in turn. | |
this.listOfNursesInTurn = new ArrayList<Nurse>(); | |
this.listOfNurses = new ArrayList<Nurse>(); | |
} | |
/** | |
* Adds a nurse to the hospice and to the back of | |
* the list of nurses in turn. | |
*/ | |
public boolean addNurse(Nurse nurse) { | |
this.listOfNursesInTurn.add(nurse); | |
this.listOfNurses.add(nurse); | |
// Show the state of nurse list. | |
printNurseList(); | |
return true; | |
} | |
/** | |
* Advance one minute in time. | |
*/ | |
public void advanceMinute() { | |
// Track time. | |
this.elapsedTime += 1; | |
// Go to the first nurse in the list and reduce their turn time. | |
if (listOfNursesInTurn.size() > 0) { | |
listOfNursesInTurn.get(0).advanceTime(); | |
// If the nurse in the head finished their turn, then, | |
// rotate list. | |
if (listOfNursesInTurn.get(0).turnFinished()) { | |
listOfNursesInTurn.get(0).resetRemainingTime(); | |
Collections.rotate(listOfNursesInTurn, listOfNursesInTurn.size() -1); | |
} | |
} | |
// If working day is off for this nurse, then take them | |
// out of the hospice. | |
for (int i = this.listOfNurses.size() - 1; i >= 0; i--) | |
if (listOfNurses.get(i).isWorkingDayOff(this.elapsedTime)) { | |
this.removeNurseFromTurn(listOfNurses.get(i).getId()); | |
this.listOfNurses.remove(i); | |
} | |
// Print the state of nurses list. | |
printNurseList(); | |
} | |
/** | |
* Removes a nurse from the list of nurses in turn. | |
*/ | |
private void removeNurseFromTurn(String nurseId) { | |
for (int i = this.listOfNursesInTurn.size() - 1; i >= 0; i--) | |
if (listOfNursesInTurn.get(i).getId().equals(nurseId)) | |
listOfNursesInTurn.remove(i); | |
} | |
/** | |
* Returns the number of nurses that are there in the hospice. | |
*/ | |
public int nursesInHospice() { | |
return this.listOfNurses.size(); | |
} | |
/** | |
* Returns the nurse that is currently in turn. | |
*/ | |
public Nurse nurseInTurn() { | |
if (listOfNursesInTurn.size() > 0) | |
return listOfNursesInTurn.get(0); | |
return null; | |
} | |
/** | |
* Returns how many time is remaining for a nurse | |
* to start their turn. | |
*/ | |
public int timeBeforeTurnIsOn(String nurseId) { | |
// Gets the specified nurse, find their index | |
// in the list of nurses in turn, and sum the minutes | |
// from all the nurses in front of them. That time | |
// should be the remaining time overall. | |
return 0; | |
} | |
/** | |
* Occupies the specified nurse. | |
*/ | |
public Nurse occupyNurse() { | |
// TODO: Get nurse in turn and occupy them. | |
return null; | |
} | |
/** | |
* Frees a nurse | |
*/ | |
public boolean freeNurse() { | |
// TODO: Get nurse in turn and free them. | |
return true; | |
} | |
/** | |
* Returns a nurse in the hospice given their ID. | |
*/ | |
private Nurse getNurseById(String id) { | |
if (listOfNurses.size() <= 0) | |
return null; | |
for (int i = 0; i < listOfNurses.size(); i++) | |
if (listOfNurses.get(i).getId().equals(id)) | |
return listOfNurses.get(i); | |
return null; | |
} | |
/** | |
* Prints the state of nurse list. | |
*/ | |
private void printNurseList() { | |
System.out.println(""); | |
System.out.println("\033[32m ------- Hospice -------- \033[0m"); | |
System.out.println("Elapsed mins -> " + this.elapsedTime); | |
for (int i = 0; i < this.listOfNurses.size(); i++) { | |
System.out.println(i + " -> off at " + this.listOfNurses.get(i).getEndOfWorkingDay()); | |
} | |
System.out.println("------- List of nurses in turn --------"); | |
for (int i = 0; i < this.listOfNursesInTurn.size(); i++) { | |
System.out.println(listOfNursesInTurn.get(i).getId() + " -> " + listOfNursesInTurn.get(i).timeLeftInTurn() + " mins left."); | |
} | |
System.out.println("---------------------------"); | |
System.out.println(""); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Import all Java utils. | |
import java.util.*; | |
// Improt java lang. | |
import java.lang.*; | |
// | |
// System for managing shifts. | |
// | |
public class ShiftSystem { | |
/** | |
* List of nurses. | |
*/ | |
private NursesList nurseList; | |
/** | |
* Hospice this system is working on. | |
*/ | |
private Hospice hospice; | |
/** | |
* Constructor. | |
*/ | |
public ShiftSystem() { | |
// Instantiate nurse list. | |
this.nurseList = new NursesList(); | |
// Create a new hospice instance. | |
this.hospice = new Hospice(); | |
} | |
/** | |
* Starts counting the time. | |
*/ | |
public void start() { | |
System.out.println("Starting time ... \033[32m OK \033[0m"); | |
// Create a timer. | |
Timer timer = new Timer(); | |
// Run timer. | |
timer.scheduleAtFixedRate(new TimerTask() { | |
// | |
// Advance a *minute* every second. | |
// | |
@Override | |
public void run() { | |
advanceMinute(); | |
} | |
}, 100, 100); | |
// }, 1000, 1000); | |
} | |
/** | |
* Advances a minute in the system. | |
*/ | |
public void advanceMinute() { | |
nurseList.advanceMinute(); | |
} | |
/** | |
* Adds a nurse to the system. | |
*/ | |
public void addNurse(Nurse nurse) { | |
this.nurseList.addNurse(nurse); | |
} | |
/** | |
* Returns how many nurses are there in the hospice. | |
*/ | |
public int nursesInHospice() { | |
return nurseList.nursesInHospice(); | |
} | |
/** | |
* Return the nurse that is currently in turn. | |
*/ | |
public Nurse nurseInTurn() { | |
return nurseList.nurseInTurn(); | |
} | |
/** | |
* Returns how much time is remaining for a | |
* nurse to start their turn. | |
*/ | |
public int timeBeforeTurnIsOn(String nurseId) { | |
return nurseList.timeBeforeTurnIsOn(nurseId); | |
} | |
/** | |
* Occupies a nurse. | |
* | |
* @return { Nurse || null } nurse currently in turn | |
* or null if they're occupied already. | |
*/ | |
public Nurse occupyNurse() { | |
return nurseList.occupyNurse(); | |
} | |
/** | |
* Frees a nurse. | |
*/ | |
public boolean freeNurse() { | |
return nurseList.freeNurse(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment