当想要比较两个变量时使用compareTo

时间:2013-11-13 17:57:04

标签: java string getter-setter schedule compareto

我正在编写一个包含3个班级的程序。该程序将读入一个列出您的约会的文件,并将其读入schedule []。将它们读入计划后,您需要对它们进行排序。您还必须能够添加其他约会,并且还能够搜索约会。输入文件的第一行如下所示:

11/10/2013 14:00讨论学生编程逻辑

其中11/10/2013是一个名为date的字符串,14:00是一个名为time的字符串,其余的句子是一个名为text的字符串。我已将这些全部读入我的数组计划中,如string,string,string

我的老师在Appointment类中创建了一个compareTo语句,它连接了日期和时间,因为需要对这两个组合进行搜索和排序,我们从未完成过具有两个变量的compareTo。

以下是Appointment()中的compareTo:

public int compareTo(Appointment other)
{
    String one, two;
    one = this.date + this.time;
    two = other.date + other.time;
    return one.compareTo(two);
} // end compareTo

在Schedule类中,我必须调用一个类“find”,要求用户输入日期和时间,然后调用我的日程表的二进制搜索()来查看是否有匹配并且我有一个约会那个日期和时间然后回到find(),输出没有apt或appt的细节。我以前做过这个,但是当我只搜索一件事时,比如日期...我的代码写的是日期搜索,因为我无法弄清楚如何使用compareTo并一起搜索两者(日期+时间)我不得不交一些东西......现在我只想知道正确的方法!!我试过把“一”和“两个”代替日期,各种不同的东西......但是很沮丧。什么都行不通。有人可以告诉我应该如何写在搜索中。我有两个问题:1。我只搜索日期而不是日期+时间。 2.在我的compareTo中,在二进制搜索中,我得到错误,“类型字符串中的方法compareTo字符串不适用于参数Appointment。”

这是我的find方法,它调用我的二进制搜索方法:

private void find()
{
    String inDate, inTime;
    int position;
    Appointment searchArg = new Appointment();

    // get info from user

    System.out.println ("Enter Date and Time separated by space: ");
    inDate = console.next();
    inTime = console.next();

    position = binarySearch(schedule, numAppointments, searchArg);
    //should that last thing be "searchArg"? or "date"? or what??
    if (position == -1)
        System.out.println(" appointment does not exist");
    else
        System.out.println("\nAppointment =");
    outputOneAppointment(position+1);       
}

private int binarySearch(Appointment[] list, int listLength, Appointment searchItem)
{
    int first = 0;
    int last = listLength - 1;
    int mid = 0;

    boolean found = false;

    while (first <= last && !found)
    {
        mid = (first + last) / 2;

        if (list[mid].date.equals(searchItem))
            found = true;  //I should not search date but rather the date and time together
        else if (list[mid].date.compareTo(searchItem) > 0)  
            //I also get that error here saying what I wrote above in my question                                   
            last = mid - 1;
        else
            first = mid + 1;
    }
    if (!found)
        mid = -1; //it is an unsuccessful search

    return mid;
}//end binarySearch

1 个答案:

答案 0 :(得分:0)

您正在将日期(您未提供任何信息)与Appointment

进行比较
list[mid].date.compareTo(searchItem)

相反,你应该比较相同类型的对象,大概是:

list[mid].date.compareTo(searchItem.date)

但是,这有点 hacky ,不应该那样做。而是implement a Comparator比较Appointment个对象:

final class AppointmentDateComparator implements Comparator<Appointment> {

    @Override
    public int compare (Appointment a1, Appointment a2) {
        // Implement your comparison logic here...
    }
}

您还可以Appointment实施Comparable,但似乎日期比较不是正确的自然顺序。

另请注意,Java已经提供Arrays.binarySearch来执行二进制搜索。