2011-06-20 33 views
9

Quiero navegar en una lista por el identificador.Lista de Java: obtener el elemento siguiente o anterior de un identificador

1- Administro/creo una lista.

2- creo función para obtener siguiente elemento de un elemento identificador de mi lista

¿Me pueden ayudar a solucionar este código?

preparar la lista

List<String> myList = new ArrayList<String>(); 
myList.add("1"); 
myList.add("2"); 
myList.add("3"); 
myList.add("4"); 
myList.add("5"); 


public String function getNext(String uid) { 

    if (myList.indexOf(uid).hasNext()) { 
     return myList.indexOf(uid).nextElement(); 
    } 
    return ""; 
} 

public String function getPrevious(String uid) { 
    return myList.indexOf(uid).hasPrevious() ? myList.indexOf(uid).previousElement() : ""; 
} 

Respuesta

10

Puede utilizar un índice para buscar su Cadena, que es más rápido y simple para implementar las funciones que las tiene.

public String getNext(String uid) { 
    int idx = myList.indexOf(uid); 
    if (idx < 0 || idx+1 == myList.size()) return ""; 
    return myList.get(idx + 1); 
} 

public String getPrevious(String uid) { 
    int idx = myList.indexOf(uid); 
    if (idx <= 0) return ""; 
    return myList.get(idx - 1); 
} 

El uso de un List.get(i) es O(1) que hace mantener el índice de la opción más rápida. List.indexOf(String) es O(n). Usar un NavigatbleSet puede parecer atractivo ya que es O(log n), sin embargo, el costo de crear un objeto es tan alto que la colección tiene que ser bastante grande antes de que pueda ver un beneficio. (En cuyo caso usaría la primera opción)

+1

solución muy elegante –

+0

con la única advertencia de que * indexOf * es una operación * O (n) * pero, yup, +1. – SyntaxT3rr0r

+0

@ SyntaxT3rr0r, Buen punto. Esta es la razón por la que conservar el índice es mejor porque 'List.get (int)' es 'O (1)' También puede hacer que el código sea más simple. –

1

Si los elementos no se repiten, lo que necesita es un NavigableSet:

http://download.oracle.com/javase/6/docs/api/java/util/NavigableSet.html

Los métodos higher y lower son lo que busca.

+0

NavigableSet extiende SortedSet. Esto no es lo que busca el OP: NavigableSet le dará el siguiente elemento en orden ordenado, no en orden de inserción. El OP está después de lo que Peter Lawrey dio como respuesta: un método que le da el elemento siguiente/anterior en el orden de inserción. – SyntaxT3rr0r

+0

@ SyntaxT3rr0r En el ejemplo, los elementos se insertan en orden lexicográfico sin repeticiones, por lo que era una suposición razonable de que estaba extraviando una lista cuando lo que realmente necesitaba era un conjunto ordenado ... Ya sabes, cuando todo lo que tienes es una martillo, todo parece un clavo. – fortran

+0

¿Estás tratando de dar a entender que todo lo que sabe OP sería un martillo? Eso sería muy grosero. También sería irónico que usted, que sabe más que el martillo, no sepa cuándo usar más que el martillo y cuándo no. Una respuesta falsa es una respuesta falsa: no intentes torcer esto a tu favor. – SyntaxT3rr0r

1

Las listas no tienen un método nextElement(). indexOf devuelve el índice entero del artículo. Usted simplemente puede añadir (o restar) a uno para obtener el siguiente (o anterior) Artículo:

public String function getNext(String uid) { 
    var index = myList.indexOf(uid); 
    if (index > -1) { 
    try { 
     return myList.get(i+1); 
    } catch (IndexOutOfBoundsException e) { 
     // Ignore 
    } 
    } 
    return ""; // consider returning `null`. It's usually a better choice. 
} 

Sin embargo mirando hacia arriba un objeto con indexOf en ArrayList es un proceso muy lento, ya que tiene que revisar cada entrada única. Hay mejores formas de hacerlo, pero eso depende de lo que realmente estés tratando de lograr.

Cuestiones relacionadas