我试图创建一个通用的next_permutation()
函数,该函数将执行与C ++ next_permutation()
函数相同的功能。编译器说:
二进制运算符'>'和'
在以下几行:
if (data.get(last) < data.get(last + 1))
if (if data.get(i) > data.get(last))
我该如何解决?
public static <T> boolean findNextPermutation(List<T> data)
{
if (data.size() <= 1)
return false;
int last = data.size() - 2;
while (last >= 0) {
if (data.get(last) < data.get(last + 1)) {
break;
}
last--;
}
if (last < 0)
return false;
int nextGreater = data.size() - 1;
for (int i = data.size() - 1; i > last; i--) {
if (data.get(i) > data.get(last)) {
nextGreater = i;
break;
}
}
data = swap(data, nextGreater, last);
data = reverse(data, last + 1, data.size() - 1);
return true;
}
T
可以是任何东西。它可能是Integer
类型或String
类型。 Integer
可以拆箱到int
并与<
或>
比较,但String
不能。
您需要缩小T
的范围。一种方法是强制T
实现Comparable
。然后,您可以使用Comparable
方法:
compareTo()
如果compareTo()
不执行或不能按照public static <T extends Comparable<T>> boolean findNextPermutation(List<T> data) {
if (data.size() <= 1)
return false;
int last = data.size() - 2;
while (last >= 0) {
if (data.get(last).compareTo(data.get(last + 1)) < 0) {
break;
}
last--;
}
if (last < 0)
return false;
int nextGreater = data.size() - 1;
for (int i = data.size() - 1; i > last; i--) {
if (data.get(i).compareTo(data.get(last)) > 0) {
nextGreater = i;
break;
}
}
data = swap(data, nextGreater, last);
data = reverse(data, last + 1, data.size() - 1);
return true;
}
的建议实施T
,则可以提供Comparable
并使用它:
this
旁注:您可以创建一个空友好的合作伙伴。例如:Comparator<T>