neo360:
Intenté crear un genérico next_permutation()
función que haría lo mismo que el C ++ next_permutation()
función. El compilador dice:
tipos de operando malos para el operador binario '>' y '<',
en las siguientes líneas:
if (data.get(last) < data.get(last + 1))
if (if data.get(i) > data.get(last))
¿Cómo resuelvo esto?
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;
}
Magnilex:
T
puede ser cualquier cosa. Podría ser de tipo Integer
o de tipo String
. Una Integer
puede ser sacó de la caja a una int
y se comparó con <
o >
, pero una String
no puede.
Es necesario para reducir lo que T
puede ser. Una forma sería a la fuerza T
a aplicar Comparable
. A continuación, puede hacer uso del compareTo()
método:
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;
}