如何使用泛型方法在数组中查找整数

时间:2018-04-20 06:41:54

标签: java generics computer-science

我还是Generics的新手,我想知道为什么我不能做“if(b [m]> key)”它可能非常简单而且我太累了,不能注意到。但正如你所看到的,我试图在一个整数数组中找到一个特定的数字。我究竟做错了什么?它必须是一种通用的方法。

public class Question1<T>
{    
/**
 * This method searches through the array of integers to check if they match the key.
 * @param b array
 * @param key certain number
 */
public static <T> void search(T[] b,T key)
{
   int l = 0; 
    int r = b.length - 1;
    while (l <= r)
    {
        int m = (l + (r-l)/2);
        if(b[m].equals(key))
            System.out.println("Key: " + key.toString()+ " is in Element: " + m);

        if (b[m] > key)
        {
            l = m + 1;
        }
        else
        {
            r = m - 1;
        }
    }
    System.out.println("Not in array.");        
}
public static void main(String[] args)
{

    Integer[] iray = {1,2,3,4,5};
    int key = 4;
    search(iray,key);
}

2 个答案:

答案 0 :(得分:1)

在Java中,泛型不适用于基本类型(int,double等),但仅适用于Objects(Integer,Double等)。盒装数字(int - &gt; Integer)不能使用比较运算符(除了==但它的行为不是你想要的那种情况)。要解决您的问题,您有两种解决方案:

使您的T通用具有可比性(通过定义)。完成后,替换

b[m].equals(key)

key.compare(b[m]) < 0

请注意,由于数组中每个值的装箱,它没有得到很好的优化。这是Java的麻烦限制。目前,正在进行的尝试解决问题的工作,并允许泛型与原始值一起使用。它被称为the Valhalla project

如果您想要优化解决方案,则必须采用与标准java.util.Arrays类相同的策略:复制每种基本类型的etod,而不使用泛型。

希望它有所帮助!

答案 1 :(得分:0)

发生错误是因为pushd C: cd\ for /F "delims=" %%a IN ('dir /b /a-d /s chrome.exe') do ( start "" "%%a" --kiosk --fullscreen --incognito "https://www.netflix.com/in/" ) pause 确实可以任何引用类型。让我们说T现在是Tjava.util.UUIDjava.util.Scannerjava.util.List无法比较这些类型的对象。有些人甚至无法进行比较。

所以你需要做的是将通用参数>约束到可以比较的类型:

T

现在,您可以在public static <T extends Comparable<T>> void search(T[] b,T key) ^^^^^^^^^^^^^^^^^^^^^ 上致电compareTo进行比较。如果b[m]大于参数:

,则该方法将返回肯定结果
b[m]

或者,您可以添加一个新的if (b[m].compareTo(key) > 0) 参数,让此方法的调用者指定他们希望如何比较对象:

Comparator

然后比较线将成为:

public static <T> void search(T[] b,T key, Comparator<? super T> comparator)

另外,你似乎(不小心?)使if (comparator.compare(b[m], key) > 0) 通用。除非您有一些未显示的代码正在使用它,否则这是不必要的。