2011-12-15 18 views
5

Quiero mantener fijos los índices de los elementos en una lista de Java.Cómo mantener el índice de lista fijo en Java

código de ejemplo: salida

import java.util.ArrayList; 
public class Test { 
    public static void main(String[] args) { 
     ArrayList<Double> a = new ArrayList<Double>(); 
     a.add(12.3); 
     a.add(15.3); 
     a.add(17.3); 

     a.remove(1); 
     System.out.println(a.get(1)); 
    } 
} 

Esta voluntad 17.3. ¡El problema es que 17.3 estaba en el índice 2 y ahora está en el índice 1!

¿Hay alguna manera de conservar los índices de otros elementos al eliminar un elemento? ¿O hay otra clase más adecuada para este propósito?

Nota: No quiero una Colección de tamaño fijo.

Respuesta

5

Es posible que desee utilizar java.util.SortedMap con int claves:

import java.util.*; 
public class Test { 

    public static void main(String[] args) 
    { 
     SortedMap<Integer, Double> a = new TreeMap<Integer, Double>(); 
     a.put(0, 12.3); 
     a.put(1, 15.3); 
     a.put(2, 17.3); 

     System.out.println(a.get(1)); // prints 15.3 
     System.out.println(a.get(2)); // prints 17.3 

     a.remove(1); 

     System.out.println(a.get(1)); // prints null 
     System.out.println(a.get(2)); // prints 17.3 
    } 
} 
  • SortedMap es una colección de tamaño variable de
  • Almacena los valores asignados a un conjunto ordenado de teclas (similar a List 's índices)

Ninguna implementación de java.util.List#remove(int) puede conservar los índices ya que el la especificación dice:

Elimina el elemento en la posición especificada en esta lista (operación opcional). Cambia cualquier elemento posterior a la izquierda (resta uno de sus índices). Devuelve el elemento que se eliminó de la lista.

+1

Y si no desea realizar un seguimiento del siguiente índice usted mismo, puede simplemente subclasificar 'SortedMap' y agregar un' public V put (valor V) ', y hacer un seguimiento del siguiente índice internamente en la subclase. –

5

En lugar de llamar al a.remove(1), puede hacer a.set(1, null). Esto mantendrá todos los elementos en el mismo lugar mientras "quita" el valor en el índice uno.

+0

de esta manera, debería implementar un nuevo tipo de listas, ¿hay algo estándar? – MhdSyrwan

+0

El método set * es * un método estándar de la interfaz de lista. Ver http://docs.oracle.com/javase/6/docs/api/java/util/List.html#set%28int,% 20E% 29 –

+0

"establecer" es, seguramente, estándar, quiero decir que quiero una clase estándar que usa este mecanismo – MhdSyrwan

4

Si la relación debe ser siempre la misma entre el índice y el valor, utilice un java.util.Map.

2

En lugar de eliminar el elemento con la llamada para eliminar fijar el elemento a nulo:

es decir:

import java.util.ArrayList; 
public class Test 
{ 
    public static void main(String[] args) 
{ 
     ArrayList<Double> a = new ArrayList<Double>(); 
     a.add(12.3); 
     a.add(15.3); 
     a.add(17.3); 

     a.set(1, null); 
     System.out.println(a.get(1)); 
    } 
} 
2

Se puede usar un HashMap<Integer, Double>. Se podría añadir elementos mediante

myMap.put(currentMaximumIndex++, myDoubleValue); 

De esta manera, los índices serían únicas, si necesita almacenamiento escasa que sería razonablemente bien, y la eliminación de un valor no estaría de los ya existentes.

+0

+1. Esta parece ser la manera más eficiente de almacenar los valores y no cambiar el índice. – eboix

1

adición a la respuesta por encima de su sugirieron también que puedes usar LinkedHashMap<Integer,Double>, en lugar de un Hashmap regulares Se preservará el orden en el que se inserta el elemento.

Cuestiones relacionadas