Quiero tener una vista de lista invertida en una lista (de manera similar a la que List#sublist
proporciona una vista de sublista en una lista). ¿Hay alguna función que proporcione esta funcionalidad?
No quiero hacer ningún tipo de copia de la lista ni modificarla.
Sin embargo, sería suficiente si pudiera obtener al menos un iterador inverso en una lista en este caso.
Además, sé cómo implementar esto yo mismo. Solo pregunto si Java ya proporciona algo como esto.
Implementación de demostración:
static <T> Iterable<T> iterableReverseList(final List<T> l) {
return new Iterable<T>() {
public Iterator<T> iterator() {
return new Iterator<T>() {
ListIterator<T> listIter = l.listIterator(l.size());
public boolean hasNext() { return listIter.hasPrevious(); }
public T next() { return listIter.previous(); }
public void remove() { listIter.remove(); }
};
}
};
}
Acabo de descubrir que algunas List
implementaciones tienen descendingIterator()
lo que necesito. Aunque no existe tal implementación general para List
. Lo cual es un poco extraño porque la implementación que he visto LinkedList
es lo suficientemente general como para funcionar con cualquiera List
.
Collections.reverse(list)
Respuestas:
Guava proporciona esto: Lists.reverse (List)
diferente a
Collections.reverse
, esto es puramente una vista ... no altera el orden de los elementos en la lista original. Además, con una lista original que es modificable, los cambios tanto en la lista original como en la vista se reflejan en la otra.fuente
List
) pero sin método inverso. al quitarlo, la guayaba volvió a estar disponible.ListIterator.previous()
Use el método .clone () en su Lista. Devolverá una copia superficial, lo que significa que contendrá punteros a los mismos objetos, por lo que no tendrá que copiar la lista. Entonces solo use Colecciones.
Es decir,
Si está utilizando
List
ay no tiene accesoclone()
, puede usarsubList()
:fuente
clone()
normalmente crearía una copia de la lista. De todos modos,List#clone()
tampoco existe.clone()
. De hecho, hace una copia completa de la lista (solo no clona cada objeto en la lista, pero eso nunca fue de lo que estaba hablando).subList
no copia, solo proporciona una vista de la lista subyacente, por lo tanto, invertir esta vista revertirá la lista subyacente.Si he entendido bien, entonces es una línea de código. Funcionó para mí.
fuente
No es exactamente elegante, pero si usa List.listIterator (int index) puede obtener un ListIterator bidireccional al final de la lista:
fuente
Collections.reverse (nums) ... Realmente invierte el orden de los elementos. El siguiente código debe ser muy apreciado:
Salida: 15,94,83,42,61
fuente
java.util.Deque
tienedescendingIterator()
- si tuList
es unDeque
, puedes usar eso.fuente
Sé que esta es una publicación antigua, pero hoy estaba buscando algo como esto. Al final escribí el código yo mismo:
No se recomienda para listas largas, esto no está optimizado en absoluto. Es una especie de solución fácil para escenarios controlados (las Listas que manejo no tienen más de 100 elementos).
Espero que ayude a alguien.
fuente
Yo uso esto:
Me gusta esto:
fuente
También puedes hacer esto:
fuente
También puede invertir la posición cuando solicita un objeto:
fuente
Para una lista de tamaño pequeño, podemos crear
LinkedList
y luego usar el iterador descendente como:fuente
Utiliza
reverse(...)
métodos dejava.util.Collections
clase. Pase su lista como parámetro y su lista se revertirá.fuente