Java: 尝试将可比较数组转换为整数数组时出错
Java: Error Trying to Convert Comparable Array to Integer Array
我目前正在 Java 中实现最长递增子序列问题的通用版本。该方法按预期工作,但当我尝试使用 Comparable[] 而不是 Integer[](或 int[])时,程序无法编译。给出的错误是"Comparable cannot be cast to Integer"。我了解错误及其含义,但不知道如何解决。任何帮助将不胜感激:)
我已经尝试将方法的 return 类型设为泛型 (>),但问题是 Java 不允许创建泛型数组。我试过只使用 Integer[] 作为我的 return 类型,虽然编译和工作正常,但这不是我想要的。
public class LIS {
public static void main(String[] args) {
final Integer[] arr = {-1, 2, 4, 2, 33, 4, 7, 8, 10, 7, 5, 4, 5, 5, 1};
final Integer[] LIS = (Integer[]) lis(arr);
for (int i : LIS) {
System.out.print(i + " ");
}
}
public static Comparable[] lis(Comparable[] arr) {
// We use Comparable[] so we can use interchangably with any Comparable type
final int N = arr.length;
// Java conveniently initializes array values to 0:
int[] lisEndingHere = new int[N];
for (int i = 0; i < N; i++) {
lisEndingHere[i] = 1;
int curMax = 0;
for (int j = 0; j <= i; j++) {
if (arr[i].compareTo(arr[j]) <= 0) continue;
if (lisEndingHere[j] > curMax) {
curMax = lisEndingHere[j];
}
}
lisEndingHere[i] += curMax;
}
// Find and return the longest increasing subsequence:
int max = 0;
for (int i = 0; i < N; i++) {
if (lisEndingHere[i] > max) max = lisEndingHere[i];
}
Comparable[] LIS = new Comparable[max];
for (int i = N-1; i >= 0 && max != 0; i--) {
if (lisEndingHere[i] == max) {
LIS[--max] = arr[i];
}
}
return LIS;
}
}
换行就行了
final Integer[] LIS = (Integer[]) lis(arr);
至
final Comparable[] LIS = lis(arr);
并更新 for 循环。
您的方法 returns 一个 Comparable 数组,因此您不能向下转换为一个整数数组,但由于您的数字的实现是整数,因此在运行时它们仍然被视为整数。
将结果设置为整数数组无论如何都违背了制作泛型方法的目的。对于要传递给你的方法的东西,它必须有一个 compareTo 方法,并且固有地有一个 toString 方法,它满足你需要程序做的一切。
这里没有什么要解决的。这里:
Integer[] LIS = (Integer[]) lis(...)
您的方法 lis() returns Comparable 对象数组。 Comparable 数组不是 Integer 数组!因此,该转换在概念上不起作用。
是的,该数组包含 Integer 对象,但 array 类型不是 "array of integer"。
您必须迭代生成的数组,然后才能强制转换各个条目。但是你不能将数组类型本身转换成它不是的东西!
除此之外,您还可以将泛型与列表一起使用。
我目前正在 Java 中实现最长递增子序列问题的通用版本。该方法按预期工作,但当我尝试使用 Comparable[] 而不是 Integer[](或 int[])时,程序无法编译。给出的错误是"Comparable cannot be cast to Integer"。我了解错误及其含义,但不知道如何解决。任何帮助将不胜感激:)
我已经尝试将方法的 return 类型设为泛型 (>),但问题是 Java 不允许创建泛型数组。我试过只使用 Integer[] 作为我的 return 类型,虽然编译和工作正常,但这不是我想要的。
public class LIS {
public static void main(String[] args) {
final Integer[] arr = {-1, 2, 4, 2, 33, 4, 7, 8, 10, 7, 5, 4, 5, 5, 1};
final Integer[] LIS = (Integer[]) lis(arr);
for (int i : LIS) {
System.out.print(i + " ");
}
}
public static Comparable[] lis(Comparable[] arr) {
// We use Comparable[] so we can use interchangably with any Comparable type
final int N = arr.length;
// Java conveniently initializes array values to 0:
int[] lisEndingHere = new int[N];
for (int i = 0; i < N; i++) {
lisEndingHere[i] = 1;
int curMax = 0;
for (int j = 0; j <= i; j++) {
if (arr[i].compareTo(arr[j]) <= 0) continue;
if (lisEndingHere[j] > curMax) {
curMax = lisEndingHere[j];
}
}
lisEndingHere[i] += curMax;
}
// Find and return the longest increasing subsequence:
int max = 0;
for (int i = 0; i < N; i++) {
if (lisEndingHere[i] > max) max = lisEndingHere[i];
}
Comparable[] LIS = new Comparable[max];
for (int i = N-1; i >= 0 && max != 0; i--) {
if (lisEndingHere[i] == max) {
LIS[--max] = arr[i];
}
}
return LIS;
}
}
换行就行了
final Integer[] LIS = (Integer[]) lis(arr);
至
final Comparable[] LIS = lis(arr);
并更新 for 循环。
您的方法 returns 一个 Comparable 数组,因此您不能向下转换为一个整数数组,但由于您的数字的实现是整数,因此在运行时它们仍然被视为整数。
将结果设置为整数数组无论如何都违背了制作泛型方法的目的。对于要传递给你的方法的东西,它必须有一个 compareTo 方法,并且固有地有一个 toString 方法,它满足你需要程序做的一切。
这里没有什么要解决的。这里:
Integer[] LIS = (Integer[]) lis(...)
您的方法 lis() returns Comparable 对象数组。 Comparable 数组不是 Integer 数组!因此,该转换在概念上不起作用。
是的,该数组包含 Integer 对象,但 array 类型不是 "array of integer"。
您必须迭代生成的数组,然后才能强制转换各个条目。但是你不能将数组类型本身转换成它不是的东西!
除此之外,您还可以将泛型与列表一起使用。