我遇到了一个问题,即给用户一个空的食谱书,他们可以输入和排序食谱。
我知道如果一本书是空的,有一个食谱和两个食谱(上升/下降),它就会被分类。这些可以使用二进制搜索。
但是当用户输入第三个食谱时,它可能是“饼干,甜甜圈,火鸡”(已分类)或“饼干,甜甜圈,苹果”,而且没有排序。如果它没有排序,那么我必须使用线性搜索。
这是我到目前为止所拥有的
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...
我知道我应该做什么,但我不知道如何处理它“代码明智”
答案 0 :(得分:3)
要确定列表是否已排序,您必须将每个元素与ist邻居进行比较。如果只有一个数千个元素没有按顺序,则二进制搜索可能会失败。所以你必须检查完整列表。但是通过所有列表来检查列表是否已排序需要比使用线性搜索查找列表中的一个元素更长的时间,因此这没有意义。如果您不确定列表是否已排序,请使用线性搜索。就是这样。
答案 1 :(得分:1)
您的代码说:
mList.sort(比较);
我相信你误解了你被要求做的事情 - 假设“使用二分法搜索,如果按其他方式使用线性搜索”,你问题的标题就是你应该做的。你根本不应该对它们进行排序。这个问题不需要知道如何用Java对事物进行排序。
您需要了解的是搜索,而不是排序。以及如何检查输入序列是否已经排序。
现在,诚然,技术上你可以通过实际排序来检查序列是否已经排序,然后检查结果序列是否与你开始时的顺序相同。但我不建议这样做。
我建议使用比较器来比较序列中每对相邻元素(如果有的话),以检查序列是单调递增还是单调递减。