建立一个这样的数据结构。
地图
键的范围实际上可以从第1天到第N天。我假设接下来的30天,所以键将从Day1到Day30。
假设需要10个人预订会议。每个人都应该在该时间段内免费。
我假设一天有30分钟的时间,在8小时的工作日中,将有16个时段。
因此,对于Day1->,您将把10个人的可用性保存为10 x 16二维int数组/矩阵。每个单元格将保持0或1。 0表示该人不可用,1表示该人可用。
关键是迭代地对每个人/时隙进行AND匹配。
(Person1在时隙0的可用性)和(Person2在时隙0的可用性)。 如果为0,立即退出循环,因为我们无法找到此时隙的匹配项。
如果在特定日期/时隙组合上重复AND的结果为1,则达到该时隙的完全匹配。以下是我的代码:
package com.ramesh.tests;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;
public class CalendarFinder {
public static void main(String[] args) {
int n=10 ;
int m=30 ;
Map<String,int[][]> personCalendar = preparePersonCalendars(n,m);
printPersonCalendar(personCalendar);
Map<String,int[][]> testData = prepareTestData(n,m);
printPersonCalendar(testData);
meetingSlotFinder(testData);
meetingSlotFinder(personCalendar);
}
private static Map<String,int[][]> preparePersonCalendars(int n, int m) {
Random rnd = new Random();
Map<String,int[][]> personCalendar = new TreeMap<String,int[][]>();
for(int i=0; i<m; i++) {
int[][] daysSlots = new int[n][16];
for(int j=0;j<n;j++) {
for(int slot=0;slot<16;slot++) {
daysSlots[j][slot] = rnd.nextInt(2);
}
}
personCalendar.put(i<9 ? "Day_0"+(i+1) : "Day_"+(i+1), daysSlots);
}
return personCalendar;
}
private static Map<String,int[][]> prepareTestData(int n, int m) {
Map<String,int[][]> testData = new TreeMap<String,int[][]>();
for(int i=0; i<m; i++) {
int[][] daysSlots = new int[n][16];
for(int j=0;j<n;j++) {
for(int slot=0;slot<16;slot++) {
daysSlots[j][slot] = i%5==0 && slot%6==0 ? 1 : 0;
}
}
testData.put(i<9 ? "Day_0"+(i+1) : "Day_"+(i+1), daysSlots);
}
return testData;
}
private static void printPersonCalendar(Map<String,int[][]> personCalendar) {
for(Map.Entry<String, int[][]> calendar: personCalendar.entrySet()) {
System.out.println("Printing Calendar availability for : " + calendar.getKey());
int[][] pCalArray = calendar.getValue();
for(int i=0; i<pCalArray.length; i++) {
System.out.println("Person : " + (i+1));
for(int j=0;j<pCalArray[0].length;j++) {
System.out.print(" " + pCalArray[i][j]);
}
System.out.print("\r\n");
}
}
}
private static void meetingSlotFinder(Map<String,int[][]> personCalendar) {
int ctr=0;
for(Map.Entry<String, int[][]> calendar: personCalendar.entrySet()) {
int[][] pCalArray = calendar.getValue();
for(int j=0;j<pCalArray[0].length;j++) {
int result = 1;
for(int i=0; i<pCalArray.length-1; i++) {
ctr++;
result = result & pCalArray[i][j]& pCalArray[i+1][j];
if(result==0) break;
}
if(result == 1)
System.out.println("**** Meeting match at Day : " +
calendar.getKey() + " and at slot: " + j);
else
System.out.println("Couldn't find any meeting match at Day : " +
calendar.getKey() + " and at slot: " + j);
}
}
System.out.println("#@$&* Total Iterations performed : " + ctr);
}
}