2010-03-23 28 views

Respuesta

74
playersList.get(0) 

Java tiene un polimorfismo de operador limitado. Así que utilizar el método get() en List objetos, no el operador de índice de matriz ([])

9

Usted tiene que acceder a las listas de manera diferente que los arrays en Java. Consulte javadocs para la interfaz List para obtener más información.

playersList.get(0) 

Sin embargo, si usted quiere encontrar el elemento más pequeño en playersList, no se debe solucionar el problema y luego obtener el primer elemento. Esto funciona muy lentamente en comparación con solo buscar una vez en la lista para encontrar el elemento más pequeño.

Por ejemplo:

int smallestIndex = 0; 
for (int i = 1; i < playersList.size(); i++) { 
    if (playersList.get(i) < playersList.get(smallestIndex)) 
     smallestIndex = i; 
} 

playersList.get(smallestIndex); 

El código anterior se encuentra el elemento más pequeño en vez de O(n)O(n log n) tiempo.

+1

Me pregunto por qué debería programarse una operación tan básica. ¿Por qué Java no proporciona una función que devuelve solo un valor mínimo de la matriz? – Roman

+2

Roman, existe tal método, Collections.min (http://java.sun.com/javase/7/docs/api/java/util/Collections.html#min%28java.util.Collection%29). –

3

Eso depende de lo que escriba su lista es, por ArrayList uso:

list.get(0); 

para LinkedList uso:

list.getFirst(); 

si te gusta el array enfoque:

list.toArray()[0]; 
+2

mal consejo. LinkedList implementa la interfaz List, no es necesario utilizar un método especial (y me sorprendería que hubiera alguna diferencia de rendimiento entre los dos). Y llamar a Array() es un desperdicio: ¡podría estar asignando la lista a una nueva matriz sin ningún motivo! – Kip

+0

@Kip, observación extraña; la clase LinkedList no implementa los primeros y los últimos métodos por despecho. Si tiene una buena razón para utilizar LinkedList, no debe abstenerse de utilizar sus métodos simplemente porque no están en la interfaz de la Lista. El ejemplo de matriz puede ser útil si la lista en sí misma no es necesaria después de la clasificación, y más cercana a lo que OP solicitó. Sin conocer el contexto del código fuente en cuestión, no puede determinar la validez del consejo. – rsp

+0

¿por qué importaría si necesita o no la lista después de ordenar? en cualquier caso (o incluso si la lista nunca se ordena) llamando a Array() solo para obtener el primer elemento (puede) crear innecesariamente una matriz completa. – Kip

0

Si su colección no es un List (y por lo tanto no se puede utilizar get(int index)), entonces usted puede utilizar el iterador:

Iterator iter = collection.iterator(); 
if (iter.hasNext()) { 
    Object first = iter.next(); 
} 
0

Si sólo que desee obtener el mínimo de una lista, en lugar de clasificarlos y luego conseguir el primer elemento (O(N log N)), puede utilizar lo haga en un tiempo lineal utilizando min:

<T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) 

que se ve retorcido en f primero, pero mirando sus preguntas anteriores, tiene un List<String>. En resumen: min funciona en él.

Para la respuesta larga: todo lo que super y extends cosas en las restricciones de tipo genérico es lo que Josh Bloch llama el principio de PECS (por lo general se presenta junto a una imagen de Arnold - No es broma!)

Productor Extiende, Súper Consumidor

En esencia, hace que los genéricos más potente, ya que las limitaciones son más flexibles al mismo tiempo conservar la seguridad de tipos (ver: what is the difference between ‘super’ and ‘extends’ in Java Generics)

2

Usando las secuencias Java 8, puede convertir su lista en una secuencia y obtener el primer elemento en una lista usando el método .findFirst().

List<String> stringsList = Arrays.asList("zordon", "alpha", "tommy"); 
Optional<String> optional = stringsList.stream().findFirst(); 
optional.get(); // "zordon" 

El método .findFirst() devolverá un Optional que pueden o no contener un valor de cadena (puede que no contiene un valor si el usuario está vacía stringsList).

Luego, para desenvolver el artículo del Opcional, utilice el método .get().

Cuestiones relacionadas