Использование реляционного оператора внутри метода binarySearch (), который является обобщением, дает ошибку. Как справиться с этой ситуацией? - PullRequest
0 голосов
/ 24 мая 2019

Вот мой код Java, и проблема заключается в том, что использование реляционного Оператор (<) внутри binarySearch () выдает ошибку. Я предполагаю, что эту ошибку я получаю, потому что операнды имеют тип объекта. Как убрать эту ошибку, чтобы моя функция работала идеально? </p>

import java.util.Random;
import java.util.Arrays;
class BinarySearch
{
    public static void main(String $[])
    {



        Integer arr[]=new Integer[20];
        for(int i=0;i<20;i++)
            arr[i]=(new Random()).nextInt()%10000;

        display("Initial array :\n");
        array(arr);

        Arrays.sort(arr);
        display("After sorting :\n");
        array(arr);

        display("Enter the element to be searched for : ");
        Integer elem=(new java.util.Scanner(System.in)).nextInt();

        display(elem+(binarySearch(arr,elem)?" Found":" Not found")+"\n");

    }
    public static <T>boolean binarySearch(T arr[],T val)
    {
        int start=0;
        int end=arr.length-1;

        while(start<=end)
        {
            int mid=(start+end)/2;
            if(arr[mid]==val)
                return true;

            if(arr[mid]<val)
                start=mid+1;
            else
                end=mid-1;
        }

        return false;
    }
    public static void display(Object o)
    {
        System.out.print(o);
    }
    public static <T>void array(T arr[])
    {
        for(int i=0;i<arr.length;i++)
            display(arr[i]+" ");
        display("\n");
    }
}

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Проблема в том, что ваш метод binarySearch () принимает параметры, которые будут объектами, а не примитивными типами, поэтому неразумно сравнивать их, используя оператор равенства ==, и недопустимо сравнивать их, используя оператор меньше чем <.Вместо этого определите ваш метод binarySearch следующим образом: </p>

public static <T extends Comparable<T>> boolean binarySearch(T arr[],T val) {
    int start = 0;
    int end = arr.length-1;

    while(start <= end) {
        int mid=(start+end)/2;
        int comparison = arr[mid].compareTo(val);
        if(comparison == 0) {
            return true;
        }

        if(comparison < 0) {
            start = mid+1;
        }
        else {
            end = mid-1;
        }
    }

    return false;
}
0 голосов
/ 24 мая 2019

Читайте здесь о дженериках. Поскольку все обобщения являются объектами - вы не можете использовать операторы сравнения с ними. Даже если вы наберете <T extends Number.

Есть два способа справиться с этим:

  1. Передайте Comparator<T> в метод и используйте comparator.compare(arr[mid], val) для сравнения значений.
  2. Напишите <T extends Comparable> и позвоните arr[mid].compareTo(val).

Оба эти метода возвращают целочисленное значение:

  • 0, если значения равны
  • отрицательно, если первое значение меньше второго
  • положительно, если первое значение больше второго
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...