using System.Collection.Generics;
public static void Main()
string fileName = "D:\\Jdeveloper\\mywork\\ConferenceTrackManagement\\src\\com\\mywork\\conference\\data\\ConferenceData.txt";
ConferenceManager conferenceManager = new ConferenceManager();
conferenceManager.scheduleConference(fileName);
catch(InvalidTalkException ite)
public class ConferenceManager
public List<List<Talk>> scheduleConference(string fileName)
List<string> talkList = getTalkListFromFile(fileName);
return scheduleConference(talkList);
public List<List<Talk>> scheduleConference(List<String> talkList)
List<Talk> talksList = validateAndCreateTalks(talkList);
return getScheduleConferenceTrack(talksList);
public List<string> getTalkListFromFile(string fileName)
List<string> talkList = new ArrayList<string>();
FileInputStream fstream = new FileInputStream(fileName);
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine = br.readLine();
while (strLine != null) {
System.err.println("Error: " + e.getMessage());
private List<Talk> validateAndCreateTalks(List<String> talkList)
Console.WriteLine("Empty Talk List");
List<Talk> validTalksList = new ArrayList<Talk>();
string minSuffix = "min";
string lightningSuffix = "lightning";
foreach(string talk in talkList)
int lastSpaceIndex = talk.LastIndexOf(" ");
ConSoleWriteLine("Invalid talk, " + talk + ". Talk time must be specify.");
string name = talk.SubString(0, lastSpaceIndex);
String timeStr = talk.SubString(lastSpaceIndex + 1);
if(name == null || "".equals(name.trim()))
Console.WriteLine("Invalid talk name, " + talk);
else if(!timeStr.EndsWith(minSuffix) && !timeStr.EndsWith(lightningSuffix))
Console.WriteLine("Invalid talk time, " + talk + ". Time must be in min or in lightning");
if(timeStr.EndsWith(minSuffix))
time = Int32.Parse(timeStr.SubString(0, timeStr.IndexOf(minSuffix)));
else if(timeStr.EndsWith(lightningSuffix))
string lightningTime = timeStr.Substring(0, timeStr.indexOf(lightningSuffix));
if("".equals(lightningTime))
time = Integer.parseInt(lightningTime) * 5;
catch(NumberFormatException nfe)
throw new InvalidTalkException("Unbale to parse time " + timeStr + " for talk " + talk);
validTalksList.add(new Talk(talk, name, time));
private List<List<Talk>> getScheduleConferenceTrack(List<Talk> talksList)
int perDayMinTime = 6 * 60;
int totalTalksTime = getTotalTalksTime(talksList);
int totalPossibleDays = totalTalksTime/perDayMinTime;
List<Talk> talksListForOperation = new ArrayList<Talk>();
talksListForOperation.addAll(talksList);
talksListForOperation.Sort();
List<List<Talk>> combForMornSessions = findPossibleCombSession(talksListForOperation, totalPossibleDays, true);
foreach(List<Talk> talkList in combForMornSessions)
talksListForOperation.removeAll(talkList);
List<List<Talk>> combForEveSessions = findPossibleCombSession(talksListForOperation, totalPossibleDays, false);
foreach(List<Talk> talkList in combForEveSessions)
talksListForOperation.removeAll(talkList);
int maxSessionTimeLimit = 240;
if(!talksListForOperation.isEmpty())
List<Talk> scheduledTalkList = new ArrayList<Talk>();
foreach(List<Talk> talkList in combForEveSessions)
int totalTime = getTotalTalksTime(talkList);
for(Talk talk in talksListForOperation)
int talkTime = talk.getTimeDuration();
if(talkTime + totalTime <= maxSessionTimeLimit)
scheduledTalkList.add(talk);
talksListForOperation.removeAll(scheduledTalkList);
if(talksListForOperation.isEmpty())
if(!talksListForOperation.IsEmpty())
Console.WriteLine("Unable to schedule all task for conferencing.");
return getScheduledTalksList(combForMornSessions, combForEveSessions);
private List<List<Talk>> findPossibleCombSession(List<Talk> talksListForOperation, int totalPossibleDays, bool morningSession)
int minSessionTimeLimit = 180;
int maxSessionTimeLimit = 240;
maxSessionTimeLimit = minSessionTimeLimit;
int talkListSize = talksListForOperation.size();
List<List<Talk>> possibleCombinationsOfTalks = new ArrayList<List<Talk>>();
int possibleCombinationCount = 0;
for(int count = 0; count < talkListSize; count++)
List<Talk> possibleCombinationList = new ArrayList<Talk>();
while(startPoint != talkListSize)
int currentCount = startPoint;
Talk currentTalk = talksListForOperation.get(currentCount);
if(currentTalk.isScheduled())
int talkTime = currentTalk.getTimeDuration();
if(talkTime > maxSessionTimeLimit || talkTime + totalTime > maxSessionTimeLimit)
possibleCombinationList.add(currentTalk);
if(totalTime == maxSessionTimeLimit)
else if(totalTime >= minSessionTimeLimit)
bool validSession = false;
validSession = (totalTime == maxSessionTimeLimit);
validSession = (totalTime >= minSessionTimeLimit && totalTime <= maxSessionTimeLimit);
possibleCombinationsOfTalks.add(possibleCombinationList);
foreach(Talk talk in possibleCombinationList)
possibleCombinationCount++;
if(possibleCombinationCount == totalPossibleDays)
return possibleCombinationsOfTalks;
private List<List<Talk>> getScheduledTalksList(List<List<Talk>> combForMornSessions, List<List<Talk>> combForEveSessions)
List<List<Talk>> scheduledTalksList = new ArrayList<List<Talk>>();
int totalPossibleDays = combForMornSessions.size();
for(int dayCount = 0; dayCount < totalPossibleDays; dayCount++)
List<Talk> talkList = new ArrayList<Talk>();
SimpleDateFormat dateFormat = new SimpleDateFormat ("hh:mma ");
int trackCount = dayCount + 1;
string scheduledTime = dateFormat.format(date);
Console.WriteLine("Track " + trackCount + ":");
List<Talk> mornSessionTalkList = combForMornSessions.get(dayCount);
foreach(Talk talk in mornSessionTalkList)
talk.setScheduledTime(scheduledTime);
Console.WriteLine(scheduledTime + talk.getTitle());
scheduledTime = getNextScheduledTime(date, talk.getTimeDuration());
int lunchTimeDuration = 60;
Talk lunchTalk = new Talk("Lunch", "Lunch", 60);
lunchTalk.setScheduledTime(scheduledTime);
Console.WriteLine(scheduledTime + "Lunch");
scheduledTime = getNextScheduledTime(date, lunchTimeDuration);
List<Talk> eveSessionTalkList = combForEveSessions.get(dayCount);
foreach(Talk talk in eveSessionTalkList)
talk.setScheduledTime(scheduledTime);
Console.WriteLine(scheduledTime + talk.getTitle());
scheduledTime = getNextScheduledTime(date, talk.getTimeDuration());
Talk networkingTalk = new Talk("Networking Event", "Networking Event", 60);
networkingTalk.setScheduledTime(scheduledTime);
talkList.Add(networkingTalk);
Console.WriteLine(scheduledTime + "Networking Event\n");
scheduledTalksList.Add(talkList);
return scheduledTalksList;
public static int getTotalTalksTime(List<Talk> talksList)
if(talksList == null || talksList.isEmpty())
foreach(Talk talk in talksList)
totalTime += talk.timeDuration;
private string getNextScheduledTime(DateTime date, int timeDuration)
long timeInLong = date.getTime();
SimpleDateFormat dateFormat = new SimpleDateFormat ("hh:mma ");
long timeDurationInLong = timeDuration * 60 * 1000;
long newTimeInLong = timeInLong + timeDurationInLong;
date.setTime(newTimeInLong);
string str = dateFormat.format(date);
boolean scheduled = false;
public Talk(String title, String name, int time)
this.timeDuration = time;
public void setScheduled(bool scheduled)
this.scheduled = scheduled;
public bool isScheduled()
public void setScheduledTime(string scheduledTime)
this.scheduledTime = scheduledTime;
public string getScheduledTime()
public int getTimeDuration()
public int compareTo(Object obj)
if(this.timeDuration > talk.timeDuration)
else if(this.timeDuration < talk.timeDuration)
public class InvalidTalkException : Exception
@SuppressWarnings("compatibility:-140331834793898838")
private static final long serialVersionUID = 1L;
public InvalidTalkException(String msg)