如何使用泛型方法在数组中查找整数
How to find a integer in an array using a Generics Method
我还是泛型的新手,我想知道为什么我做不到 "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);
}
错误的发生是因为 T
字面上可以是 任何引用类型 。假设 T
现在是 java.util.UUID
或 java.util.Scanner
或 java.util.List
。 >
无法比较这些类型的对象。有些甚至根本无法比较
所以你需要做的是将泛型参数T
约束为可以比较的类型:
public static <T extends Comparable<T>> void search(T[] b,T key)
^^^^^^^^^^^^^^^^^^^^^
现在,您可以在 b[m]
上调用 compareTo
来比较它们。如果 b[m]
大于参数:
,该方法将 return 为正结果
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
通用。这是不必要的,除非您有一些未显示的代码正在使用它。
在 Java 中,泛型不能用于基元类型(int、double 等),只能用于对象(Integer、Double 等)。盒装数字 (int --> Integer) 不能使用比较运算符(除了 ==,但在这种情况下它的行为不是您想要的)。要解决您的问题,您有两种解决方案:
使您的 T 泛型具有可比性(通过定义 )。完成后,替换
b[m].equals(key)
与
key.compare(b[m]) < 0
请注意,由于数组中每个值的装箱,它不是很优化。这是 Java 的一个麻烦的限制。目前,正在进行一项尝试解决该问题的工作,并允许泛型与原始值一起使用。它被称为the Valhalla project。
如果你想要优化的解决方案,你不得不采用与标准相同的策略 java.util.Arrays class:为每个基本类型复制你的 etod,而不使用泛型。
希望对您有所帮助!
我还是泛型的新手,我想知道为什么我做不到 "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);
}
错误的发生是因为 T
字面上可以是 任何引用类型 。假设 T
现在是 java.util.UUID
或 java.util.Scanner
或 java.util.List
。 >
无法比较这些类型的对象。有些甚至根本无法比较
所以你需要做的是将泛型参数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
通用。这是不必要的,除非您有一些未显示的代码正在使用它。
在 Java 中,泛型不能用于基元类型(int、double 等),只能用于对象(Integer、Double 等)。盒装数字 (int --> Integer) 不能使用比较运算符(除了 ==,但在这种情况下它的行为不是您想要的)。要解决您的问题,您有两种解决方案:
使您的 T 泛型具有可比性(通过定义 )。完成后,替换
b[m].equals(key)
与
key.compare(b[m]) < 0
请注意,由于数组中每个值的装箱,它不是很优化。这是 Java 的一个麻烦的限制。目前,正在进行一项尝试解决该问题的工作,并允许泛型与原始值一起使用。它被称为the Valhalla project。
如果你想要优化的解决方案,你不得不采用与标准相同的策略 java.util.Arrays class:为每个基本类型复制你的 etod,而不使用泛型。
希望对您有所帮助!