-2

予定を 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 番目の予定で、スタック オーバーフローの例外が発生します。

ご協力ありがとうございました

4

1 に答える 1

0

return overlap(list, start, middle - 1, startCal, endCal);

開始 = 0 および終了 = 1、中間 = 0+1/2 = 0 でオーバーラップを呼び出す場合、開始 = 0 および終了 = -1.. でオーバーラップを呼び出します。の停止条件に到達しましたstart == end

start == endに変えてみてくださいstart > end

編集:問題2はこの呼び出しです

return overlap(list, middle, end, startCal, endCal);

開始 = 0 および終了 = 1 でオーバーラップを呼び出すと、中間 = 0+1/2 = 0 になるため、開始 = 0 および終了 = 1 でオーバーラップを呼び出します... 無限再帰ループ! スタックオーバーフロー!それは決して終わらない。

これを解決するには、 に変換middlemiddle + 1ます。

于 2013-03-20T02:38:41.803 に答える