2017-02-13 10 views
-1
public static boolean binarySearch(ArrayList<Student> students, int search) { 
    int first = 0; 
    int last = students.size() - 1; 
    int mid; 
    while (first <= last) { 
     mid = first + (last - first)/2; 
     if (search == students.getTotal(i)) { 
      return true; 
     } else if (students.compareTo(students.get(mid)) < 0) { 
      last = mid - 1; 
     } else { 
      first = mid + 1; 
     } 
    } 

    return false; 
} 

В этом методе я должен вернуться true если search найден, и если falsesearch не найден.
Однако я не могу получить информацию от ArrayList.Java ArrayList бинарный поиск (ArrayList)

Здесь две ошибки.

Один на

search == students.getTotal(i) 

Другой на

students.compareTo(students.get(mid)) 

Для первого я должен получить доступ к students и сравнить i искать, но я не могу получить данные в students.

Во второй, которую я должен получить, если поиск продолжится на стороне ВЛЕВО или ВПРАВО.

Может ли кто-нибудь дать мне какие-либо советы о том, как это решить? Я мог бы знать, что я использую неправильный способ получения данных, но мне нужно направление.

+4

1) ArrayList не имеет метода getTotal – Darshan

+0

У меня есть getTotal в моем классе учеников, я не могу назвать его? – POH

+0

Возможный дубликат [Java BinarySearch] (http://stackoverflow.com/questions/12517764/java-binarysearch) –

ответ

1

TL; Проблема заключается в том, что вы путаете ArrayList students и его членов.
Вы применяете методы к students, ArrayList, которые вы должны применять к своим отдельным членам.

Более углубленное объяснение:

Как отмечается в комментариях по @Darshan, ArrayList не метод getTotal. Даже если бы это было так, этот код всегда возвращал бы то же значение.

Вы, вероятно, имел в виду

search == students.get(i).getTotal() 

Это занимает i -ю студента, и применяет getTotal() к этому экземпляру Student. Возврат результата getTotal для этого конкретного ученика.

Вы по существу ту же ошибку во второй части:

students.compareTo(students.get(mid)) < 0) 

Здесь, опять же вы берете ArrayListstudents и попытаться применить метод к ArrayList, а не к отдельному студенту.

Раствор снова:.. Если взять конкретный студент из списка (Student #i, которые были определены students.get(i) и применить метод compareTo к тому, что

Официальная документация для ArrayLists является here

+0

Я все еще получаю сообщение об ошибке «Метод elementAt (int) не определен для типа ArrayList « есть ли какой-либо веб-сайт, на котором я могу узнать о вызове элементов? – POH

+0

@ POH Плохо, в ArrayLists это называется 'get'. См. [Официальная документация для ArrayList] (https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html). Я обновил ответ. –

+0

Я попробовал свое кодирование для "students.compareTo (students.get (mid))" , но это не было частью документации, которую вы мне дали, и нет никакого способа сравнить две строки, есть альтернативный метод, который я могу отслеживать – POH

1

Первый из всего, что я думаю, это середина = (первая + последняя)/2.

Во-вторых, я бы использовал массив, потому что это проще.Но если вы специально хотите использовать ArrayList, то вы можете сделать следующее:

public static boolean binarySearch(ArrayList<Student> students, int search) { 
    int first = 0; 
    int last = students.size() - 1; 
    int mid; 
    while (first <= last) { 
     mid = (first + last)/2; 
     if (search == students.get(i)) { 
      return true; 
     } else if (search.compareTo(students.get(mid)) > 0) { 
      last = mid - 1; 
     } else { 
      first = mid + 1; 
     } 
    } 

    return false; 
} 

Объяснение: с ArrayList.get вы получите только элемент ArrayList в определенном месте i, который вы хотите сравнить с mid элемента ,
Ошибка, которую вы делаете, заключается в том, что вы сравниваете весь список students с конкретным элементом в списке (средний), где вы должны сравнить значение, которое вы ищете, с средним элементом списка, чтобы увидеть, больше или меньше.

+0

Добро пожаловать в переполнение стека! Я позволил вам отредактировать ваш ответ; вы можете поместить имена переменных в «уценку кода», поставив обратные элементы вокруг них. Во всяком случае, у вас есть правильный ответ - OP путает список и отдельные элементы. –

+0

весь сайт, на который я отправился, чтобы найти binarysearch, были все mid = first + (last-first)/2; есть ли какой-либо веб-сайт, на который я могу посмотреть, для преобразования массива в arraylist? – POH