【问题标题】:How to find a integer in an array using a Generics Method如何使用泛型方法在数组中查找整数
【发布时间】:2018-04-20 06:41:53
【问题描述】:

我还是 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);
}

【问题讨论】:

  • 你不能用&gt;比较对象。

标签: java generics computer-science


【解决方案1】:

在 Java 中,泛型不能用于原始类型(int、double 等),而只能用于对象(Integer、Double 等)。盒装数字(int --> Integer)不能使用比较运算符(== 除外,但在这种情况下它的行为不是您想要的)。要解决您的问题,您有两种解决方案:

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

b[m].equals(key)

key.compare(b[m]) < 0

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

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

希望对你有帮助!

【讨论】:

    【解决方案2】:

    发生错误是因为T 实际上可以是任何引用类型。假设T 现在是java.util.UUIDjava.util.Scannerjava.util.List&gt; 无法比较这些类型的对象。有些甚至根本无法比较。

    所以你需要做的是将泛型参数T 限制为可以比较的类型:

    public static <T extends Comparable<T>> void search(T[] b,T key)
                     ^^^^^^^^^^^^^^^^^^^^^
    

    现在,您可以在b[m] 上致电compareTo 进行比较。如果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)
    

    另外,您似乎(不小心?)将Question 设为通用。除非您有一些未显示的代码正在使用它,否则这是不必要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2013-12-26
      相关资源
      最近更新 更多