Listas
Las listas son variables que pueden almacenar múltiples valores. Estos valores son accesibles a través de un índice numérico que indica su posición, por lo que el acceso a los mismos es inmediato (en contraposición a los conjuntos, que el acceso a los elementos es indexado por una hash).
Para crear una lista tan solo hay que indicar los valores separados por comas y encerrados ente corchetes.
listaVacia = {}
lista = {"hola","como","estas"}
otraLista = {null, "Hola", 232, false}
Las listas también pueden crearse a partir de un conjunto dado, con el método createList() de los conjuntos.
Leer elementos
Para acceder a los elementos de una lista, es necesario indicar entre corchetes un valor numérico con su índice o posición. Esta posición parte de 0 y su valor máximo es el tamaño de la lista menos 1. Por ejemplo, con un lista de 4 elementos podemos acceder desde la posición 0 hasta la 3.
lista = {"hola", 22, "estas"}
// imprime hola
println lista[0]
// imprime estas
println lista[2]
Si un elemento de la lista fuera otra lista, se pueden utilizar unos nuevos corchetes para navegar hasta el elemento deseado:
lista = {"hola", {22,33,44}, "estas"}
// pinta "hola"
println lista[0]
// pinta {22,33,44}
println lista[1]
// pinta 22
println lista[1][0]
// pinta 33
println lista[1][2]
Acceder a un elemento fuera del rango de la lista, provocará un fallo:
lista = {"hola", 22, "estas"}
// ¡Esto fallará! La posicion 3 no existe, solo hay de 0 a 2
println lista[3]
Modificar elementos
Para modificar un elemento de la lista, tan solo tenemos que asignárselo con el simbolo = como si de una variable normal se tratase.
lista = {"hola", 22, "estas"}
lista[0] = "adios"
lista[1] = "muy"
lista[2] = "buenas"
Asignar un valor a un elemento fuera del rango de la lista, provocará un fallo:
lista = {"hola","como","estas"}
// ¡Esto fallará! La posicion 3 no existe, solo hay de 0 a 2
lista[3] = "no"
Leer con get(posicion) o at(posicion) y modificar con set(posicion, valor)
Los elementos también se pueden leer con el método get() y se pueden modificar con set(), aunque es más cómodo utilizar los corchetes con la posición. La ventaja de set() con respecto a la asignación directa, es que set() retorna el valor anterior que hubiera en la posición antes de asignar el nuevo valor.
lista = {"hola","como","estas"}
// Esto equivale a lista[2], imprime "estas"
lista.get(2)
lista.at(2)
// Esto equivale a lista[2] = "hola", imprime "como", ya que es el valor de la posición 2 antes de imprimir
println lista.set(2, "hola")
Añadir nuevos elementos: add(valor,...) y insert(pos, valor,...)
El método add() permite añadir uno o más elementos en la misma llamada, separando los valores a añadir por comas. Los elementos se añadirán al final y el tamaño de la lista se verá incrementado en el número de elementos añadidos.
// Crea una lista vacia
lista = {}
// El tamaño es 0
println lista.size()
// Añade un elemento a la lista
lista.add("hola")
// Añade dos elementos a la lista en la misma llamada
lista.add("que", "tal")
// Ahora el nuevo tamaño es 3
println lista.size()
El método insert() permite insertar uno o más elementos especificando la posición concreta a partir de la cual serán insertados. El resultado es que los elementos a añadir se encontrarán de la posición indicada en adelanta, el resto de elementos se desplazarán y la lista se verá incrementada en el número de elementos insertados. También se puede utilizar el método insertAt().
lista = {"hola","como", "estas"}
// Añade a partir de la tercera posición (2) los elementos "no", "me"
lista.insert(2, "no","me")
// Ahora la lista se queda como {"hola","como", "no", "me", "estas"}
println lista
Añadir todos los elementos de una colección: addAll(coleccion)
El método addAll() añade al final de la lista actual todos los elementos de la colección (conjunto o lista) especificada como parámetro. El funcionamiento interno consiste en recorrerse la colección a añadir y llamar por cada uno de sus elementos al método add().
lista = {"hola","como", "estas"}
otra = {"x","y"}
// Ahora la lista tendrá 5 elementos, con "x", "y" al final
lista.addAll(otra)
println lista
Insertar todos los elementos de una colección: addAll(posicion, coleccion)
El método addAll() inserta en una posición concreta de la lista actual todos los elementos de la colección (conjunto o lista) especificada como parámetro. La posición empieza desde 0, siendo el 0 el primer elemento.
lista = {"hola","como", "estas"}
otra = {"x","y"}
// Ahora la lista será: "hola","x","y","como","estas"
lista.addAll(1, otra)
println lista
Borrar elementos de una posición exacta: delete(posicion)
Se pueden eliminar elementos situados en una posición concreta utilizando el método delete(posicion). El tamaño de la lista se reducirá en uno. La posición empieza desde 0, siendo el 0 el primer elemento. También se puede utilizar el método deleteAt().
lista = {"hola", "como", "estas"}
// Borra la primera posicion, la lista se queda en {"como", "estas"}
lista.delete(0)
println lista
Borrar elementos por su contenido: remove(valor,...)
Se pueden eliminar elementos (si existen) en función de su valor con el método remove(valor). Si hay más de un elemento que coincida con el valor a borrar solo se eliminará el primero de ellos. Una vez eliminado, el tamaño de la lista se reducirá en uno y el método retornara true. Si el elemento a borrar no se encuentra, retornará false.
Para buscar el elemento a borrar se realiza una búsqueda secuencial, lo cual implica recorrerse todas los elementos de la lista por orden y comparar cada uno de ellos por el elemento a borrar. Por esta razón, la velocidad de la búsqueda dependerá del tamaño de la lista y en listas muy grandes su rendimiento puede llegar a caer. Para optimizar búsquedas por valor, utilizar conjuntos.
El método puede recibir más de un parámetro, de esta manera se pueden eliminar varios elementos en la misma llamada. En este caso, el método devuelve true o false en función de si ha conseguido borrar o no el último elemento (último parámetro).
lista = {"hola", "como", "estas"}
// Borra el elemento "como" y pinta true, la lista se queda en {"hola", "estas"}
println lista.remove("como")
// Ahora borramos varios elementos. Devuelve true porque el elemento "estas" existe y se ha conseguido borrar.
println lista.remove("hola", "estas")
// Este elemento no existe, la lista se queda como estaba y pinta false por no haberlo encontrado.
println lista.remove("noexiste")
Elimina el contenido de una lista en otra: método removeAll(coleccion)
Este método recibe como parámetro una coleccion (lista o conjunto) y se encarga de buscar y borrar sus elementos en la lista actual. El funcionamiento interno consiste en recorrerse la colección a borrar y llamar por cada uno de sus elementos al método remove().
lista = {"hola", "alberto", "como", "estas", "tu"}
otra = {"alberto", "tu"}
// Elimina de la primera lista los elementos de la segunda, la lista se queda en {"hola", "como", "estas"}
lista.removeAll(otra)
Obtener el tamaño de la lista: método size()
El método size() devuelve el tamaño del mapa. Devuelve 0 si está vacío. También se puede utilizar el método length()
lista = {"hola", "como", "estas"}
// Imprime 3, que es el tamaño de la lista
println lista.size()
¿Lista vacía? método isEmpty()
El método isEmpty() devuelve true si la lista está vacía (es decir, si size() == 0). También se puede utilizar el método empty()
lista = {"hola", "como", "estas"}
// Imprime false, pues no esta vacio
println lista.isEmpty()
Vaciar la lista: método clear()
El método clear() vacía todos los elementos, dejando su tamaño a 0.
lista = {"hola", "como", "estas"}
lista.clear()
// Imprime 0, pues esta vacía
println lista.size()
¿Existe un elemento? método contains(valor)
El método contains() devuelve true si el parámetro especificado existe en la lista. También se puede utilizar el método has() para buscar un elemento.
Para buscar el elemento se realiza una búsqueda secuencial, lo cual implica recorrerse todas los elementos de la lista por orden y comparar cada uno de ellos por el elemento buscado. Por esta razón, la velocidad de la búsqueda dependerá del tamaño de la lista y en listas muy grandes su rendimiento puede llegar a caer. Para optimizar búsquedas por valor, utilizar conjuntos.
lista = {"hola", "como", "estas"}
// Imprime true, pues la clave como existe
println lista.contains("como")
¿Existe todos los elemento de otra lista? método containsAll(conjunto)
El método containsAll() devuelve true si todos los elementos de la colección (lista o conjunto) pasada como parámetro existen en la lista. Es decir, devuelve true si la lista es un conjunto igual o subconjunto de la lista actual. El funcionamiento interno consiste en recorrerse la colección cuyos elementos se desean verificar si están y llamar por cada uno de sus elementos al método contains(). También se puede utilizar el método hasAll()
Para buscar cada elemento se realiza una búsqueda secuencial, lo cual implica recorrerse todas los elementos de la lista por orden y comparar cada uno de ellos por el elemento buscado. Por esta razón, la velocidad de la búsqueda dependerá del tamaño de la lista y en listas muy grandes su rendimiento puede llegar a caer. Para optimizar búsquedas por valor, utilizar conjuntos.
lista = {"hola", "como", "estas"}
otra = {"como", "estas"}
// Imprime true, pues todos los elementos existen
println lista.containsAll(otra)
Averiguar la posición de un elemento: método indexOf(valor) y lastIndexOf(valor)
Estos métodos devuelven la posición del elemento en la lista que coincide con el parámetro especificado. En el caso de que haya más de un elemento que coincida con el valor especificado, indexOf() devuelve el primero (empieza a buscar por el principio) y lastIndexOf() devuelve el último (empieza a buscar por el final). Si no encuentra el elemento, devuelve -1. También se pueden utilizar los método index() y lastIndex().
Para buscar el elemento se realiza una búsqueda secuencial, lo cual implica recorrerse todas los elementos de la lista por orden y comparar cada uno de ellos por el elemento buscado. Por esta razón, la velocidad de la búsqueda dependerá del tamaño de la lista y en listas muy grandes su rendimiento puede llegar a caer. Para optimizar búsquedas por valor, utilizar conjuntos.
lista = {"hola", "tu", "como", "estas", "tu"}
// Imprime 1, la primera posición donde aparece "tu"
println lista.indexOf("tu")
// Imprime -1, ya que "yo" no existe.
println lista.indexOf("no")
// Imprime 4, la última posición donde aparece "tu"
println lista.lastIndexOf("tu")
Crear un conjunto a partir de una lista: método createSet()
El método createSet() devuelve un conjunto cuyos elementos serán los de la lista actual, teniendo en cuenta que los conjuntos no permiten elementos repetidos. Por esta razón, si la lista tiene elementos que aparecen más de una vez, solo aparecen una. La ventaja de los conjuntos es que la búsqueda de elementos en los mismos está más optimizado que la búsqueda secuencial que se hace en las listas en los métodos indexOf(), contains(), containsAll(), remove(), removeAll(), ya que los conjuntos tienes sus valores hasheados.
lista = {"a","b","c","c","c","d"}
// Crea un conjunto. El elemento "c" solo aparece una vez.
conjunto = lista.createSet()
Listas como pilas LIFO (stack)
El comportamiento de una pila LIFO o stack se basa en que los elementos se añaden por encima (apilar) y se quitan también por encima (desapilar). Imagina una pila de platos sobre una mesa: los vamos dejando unos encima de otros. A la hora de cogerlos, cogemos siempre el primero de la pila.
Las pilas son una estructura de datos muy útil. Puedes ver más información sobre pilas en la entrada de Pila en Wikipedia
Todas las listas pueden ser utilizadas como pilas sin hacer ninguna modificación. Para acceder a los datos, se han añadido los siguientes métodos:
Apilar: push(valor)
Añade un elemento en la parte superior de la pila. Equivale al método add(valor)
Leer la cima de la pila: peek()
Devuelve el contenido de la parte superior de la pila (sin quitarlo). Si la pila esta vacía, devuelve null. Equivale al método get(size()-1)
Leer la cima y desapilarla: pop()
Quita y devuelve el contenido de la parte superior de la pila. Si la pila esta vacía, devuelve null. Equivale a get(size()-1) y remove(size()-1)
pila = {}
pila.push(2)
pila.push(3)
pila.push(5)
pila.push(8)
// Pinta 8, que es el valor de la cima
println pila.peek()
// Pinta 8, 5, 3, 2, ya que va desapilando la pila hasta dejarla vacía
while (!pila.isEmpty())
println pila.pop()
enddo
Listas como colas FIFO
El comportamiento de una cola FIFO se basa en que los elementos se añaden por detrás pero se quitan por delante. Imagina una cola de personas en el cine: las personas se van uniendo a la cola por detrás, pero se van quitando por delante (según van entrando al cine).
Las colas son una estructura de datos muy útil. Puedes ver más información sobre colas en la entrada de Queue en Wikipedia
Todas las listas pueden ser utilizadas como colas sin hacer ninguna modificación. Para acceder a los datos, se han añadido los siguientes métodos:
Apilar: push(valor)
Añade un elemento en el final de la cola. Equivale al método add(valor)
Leer la base: peekBase()
Devuelve el contenido del primer elemento de la cola (sin quitarlo). Si la cola esta vacía, devuelve null. Equivale al método get(0)
Leer la base y eliminarla: popBase()
Quita y devuelve el contenido del primer elemento de la cola. Si la cola esta vacía, devuelve null. Equivale a get(0) y remove(0)
cola = {}
cola.push(2)
cola.push(3)
cola.push(5)
cola.push(8)
// Pinta 2, que es el primer valor introducido en la cola
println cola.peekBase()
// Pinta 2, 3, 5 y 8, ya que va quitando elementos de la cola hasta dejarla vacía
while (!cola.isEmpty())
println cola.popBase()
enddo
Propiedades de las listas
Algunos métodos también son accesibles como propiedad:
| Método | Propiedad equivalente |
|---|---|
lista.empty() | lista.empty |
lista.isEmpty() | lista.isEmpty |
lista.size() | lista.size |
lista.length() | lista.length |
Ejemplo
lista = {}
// pinta 0
println lista.size
// pinta true
println lista.empty
Más información
Las listas en OgnlScript se corresponden con la implementación de ArrayList de Java.
- Sobre la construcción de listas en OGNL: http://www.ognl.org/2.6.9/Documentation/html/LanguageGuide/collectionConstruction.html
- java.util.List: http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html
- java.util.ArrayList: http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html