0

我遇到了一个问题,用户得到一个空的食谱书,他们可以输入和排序食谱。

我知道如果一本书是空的,它就会被排序,有一个食谱和两个食谱(升序/降序)。这些可以使用二进制搜索。

但是当用户输入第三个食谱时,它可能是“cookies, donut, turkey”(已排序)或“cookies, donut, apples”且未排序。如果它没有排序,那么我必须使用线性搜索。

这是我到目前为止所拥有的

 public void sortBook(int choice, boolean ascend) {
  RecipeBookComparator comparing = new RecipeBookComparator(choice, ascend);
  mList.sort(comparing);}

public class RecipeBookComparator implements Comparator {
  private int mSortRBook;
  private boolean mAscend;
  public RecipeBookComparator (int choice, boolean ascend) {
     mSortRBook = choice;
     mAscend = ascend;
  }
  public int compare(Object o1, Object o2) {
     Recipe s1 = (Recipe)o1, s2 = (Recipe)o2;
     switch (mSortRBook) {
        case 1:
           if (mAscend == true) {
              int compareName = s1.getName().compareTo(s2.getName());
              if (compareName != 0) {
                 return compareName;
              }
           }
           else {
              int compareName = s1.getName().compareTo(s2.getName());
              if (compareName != 0) {
                 return compareName * -1;
              }
           } ///more cases...

我知道我应该做什么,但我不知道如何“以代码方式”处理它

4

2 回答 2

3

要确定列表是否已排序,您必须将每个元素与 ist 邻居进行比较。如果数千个元素中只有一个元素不按顺序排列,则二进制搜索可能会失败。所以你必须检查完整的列表。但是遍历所有列表以检查列表是否已排序比使用线性搜索在列表中查找一个元素需要更长的时间,因此这没有任何意义。如果您不确定列表是否已排序,请使用线性搜索。而已。

于 2013-12-19T22:30:45.927 回答
1

你的代码说:

mList.sort(比较);

我相信你误解了你被要求做的事情 - 假设“如果排序则使用二进制搜索,否则使用线性搜索”,你的问题的标题,是你应该做的。你根本不应该对它们进行排序。这个问题不需要任何关于如何在 Java 中对事物进行排序的知识。

您需要了解的是搜索,而不是排序。以及如何检查输入序列是否已经排序。

现在,诚然,从技术上讲,您可以通过实际排序来检查序列是否已经排序,然后检查结果序列是否与您开始时的顺序相同。但我不建议这样做。

相反,我建议使用 Comparator 比较序列中的每对相邻元素(如果有),以检查序列是单调递增还是单调递减。

于 2013-12-19T22:28:44.783 回答