通用置换函数元素比较给出编译器错误
Generic permutation function element comparison gives compiler error
我试图创建一个通用的 next_permutation()
函数,它与 C++ next_permutation()
函数的功能相同。编译器说:
bad operand types for binary operator '>' and '<',
在以下几行:
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
. You can then make use of the 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
答案,您可以提供 Comparator<T>
并使用它:
public static <T> boolean findNextPermutation(List<T> data, Comparator<T> comperator) {
if (data.size() <= 1) return false;
int last = data.size() - 2;
while (last >= 0) {
if (comperator.compare(data.get(last),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 (comperator.compare(data.get(i), data.get(last)) > 0) {
nextGreater = i;
break;
}
}
data = swap(data, nextGreater, last);
data = reverse(data, last + 1, data.size() - 1);
return true;
}
旁注:您可以创建一个 null 友好合作者。例如:
Comparator<T> nullSafeComperator = Comparator.nullsFirst(comperator);
我试图创建一个通用的 next_permutation()
函数,它与 C++ next_permutation()
函数的功能相同。编译器说:
bad operand types for binary operator '>' and '<',
在以下几行:
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
. You can then make use of the 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
答案,您可以提供 Comparator<T>
并使用它:
public static <T> boolean findNextPermutation(List<T> data, Comparator<T> comperator) {
if (data.size() <= 1) return false;
int last = data.size() - 2;
while (last >= 0) {
if (comperator.compare(data.get(last),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 (comperator.compare(data.get(i), data.get(last)) > 0) {
nextGreater = i;
break;
}
}
data = swap(data, nextGreater, last);
data = reverse(data, last + 1, data.size() - 1);
return true;
}
旁注:您可以创建一个 null 友好合作者。例如:
Comparator<T> nullSafeComperator = Comparator.nullsFirst(comperator);