予定を ArrayList に格納するプログラムを作成しています。ユーザーは、予定の日付、開始時刻、および終了時刻を入力するよう求められます。プログラムは、ユーザーが新しい予定を送信したいときに、既に予定があるかどうかを確認する必要があります。これが再帰二分探索の部分です。これが私がこれまでに実装したものです。
方法:
public boolean overlap(ArrayList<Appointment> list, int start, int end,
Calendar startCal, Calendar endCal)
{
int middle = (start + end)/2;
System.out.println("Start: " + start + " End: " + end + " Middle: " + middle);
Appointment appt = list.get(middle);
if(start == end){
return((startCal.compareTo(appt.getStart()) >= 0 && startCal.compareTo(appt.getEnd()) <= 0 ) ||
endCal.compareTo(appt.getEnd()) <= 0 && endCal.compareTo(appt.getStart()) >= 0 );
}
else if(startCal.compareTo(appt.getStart()) <= 0 && endCal.compareTo(appt.getStart()) <= 0){
return overlap(list, start, middle - 1, startCal, endCal);
}
else{
return overlap(list, middle, end, startCal, endCal);
}
}
私はそれをどのように呼んでいますか:
case 1 : //Enter a new appointment
setCal();
startDate = new GregorianCalendar(year, month, day, hour, minute);
endDate = new GregorianCalendar(year, month, day, endHour, endMinute);
appt = new Appointment(description, startDate, endDate);
if(apptList.isEmpty()){
apptList.add(appt);
}
else{
boolean isOverlap = overlap(apptList, 0, apptList.size() - 1,
appt.getStart(), appt.getEnd());
if(isOverlap){
System.out.println("");
System.out.println("ERROR: There is already an appointment at that time");
System.out.println("");
}
else{
int indexToBeAdded = indexFinder(apptList, 0, apptList.size() -1,
appt.getStart(), appt.getEnd());
Appointment tmp = apptList.get(indexToBeAdded);
if(tmp.start.compareTo(appt.start) < 0){
apptList.add(indexToBeAdded + 1, appt);
}
else{
apptList.add(indexToBeAdded , appt);
}
}
}
choice = 0;
break;
setCal() は、ユーザーにすべてのカレンダー パラメータの入力を求めるだけで、入力内容に基づいてパラメータを設定します。また、indexFinder は、予定が正しい順序で追加されるように、予定を追加する必要があるインデックスを見つける別の再帰的なバイナリ検索方法です。 .
今のところ、追加しようとする 3 番目の予定で、スタック オーバーフローの例外が発生します。
ご協力ありがとうございました