2012-08-28 9 views
6

¿Cómo puedo ordenar android.util.SparseArray? P. ej. Tengo SparseArray con:
1-2,33
5-1,5
Resultado:
5-1,5
1-2,33Ordenar SparseArray en Android

Gracias !!!

- EDITADO

He utilizado el Mapa. Gracias por la ayuda.

+2

¿Por qué quieres a solucionar el problema? Las teclas no cambian y 'SparseArray' no implementa' Iterable'. – nkr

+2

El 'Iterable' no es tanto el problema, pero estaría de acuerdo en que si el objetivo es tener esta estructura de datos ordenada, las estructuras de datos Java comunes, como una subclase de' Map', tendrían más sentido. No quiere decir que no pudo ordenar un 'SpareArray' de la manera deseada, pero es más trabajo que usar una solución lista para usar. – Tom

+0

@Tom: Sí, debería usar otra estructura de datos. Incluso cuando se las arregla para ordenar el 'SparseArray', no podrá obtener los valores en el orden correcto. – nkr

Respuesta

0

A juzgar por el código fuente subyacente para SparseArray.java, no podrá hacerlo simplemente llamando a un método. Todo un SpareArray es dos matrices en lenguaje Java, una de tipo int y una de tipo Object. Esas matrices son variables de instancia privadas y no puede hacer referencia a ellas sin Reflexión (lo cual es peligroso ya que sus nombres pueden cambiar). Una buena solución podría ser localizar el código SpareArray en su aplicación y agregar un método sort usando técnicas normales de Java, es decir, Array.sort.

-5

Recoge tus llaves/valores a una lista.

   List<Integer>keys = Lists.newArrayList(); 
       List<Integer>vals = Lists.newArrayList(); 
    SparseArray<Integer>arr; 
    for(int i =0; i < arr.size();i++){ 
    keys.add(arr.keyAt(i)); 
    values.add(arr.valueAt(i)); 
    } 
    Collections.sort(keys);// sort 
    Collections.sort(vals); 
    // then fill your array again. 
    arr.clear(); 
    //... 
    arr.put() 
+1

Definitivamente es un enfoque válido, pero es peligroso desde el punto de vista del rendimiento. Está creando Listas que no necesitan crearse y llamando a un método simplemente para obtener un elemento de matriz. Además, el tamaño es un método, no un campo. – Tom

+6

Esto definitivamente arruinará la asignación de claves y valores. – nkr

5

No está claro si ha solicitado una clave o valor clasificadas fin ...

tan sólo una nota:

Una búsqueda binaria sólo funciona en los datos ordenados y SparseArray utiliza una búsqueda binaria para su matriz de claves ordenadas (!) según the source. Entonces las claves ya están ordenadas y no aceptarán un orden diferente como el orden de los valores.

2

Uso LinkedHashMap si desea que el mapa se clasifique

Actualización:

Usted puede utilizar TreeMap. Mantiene las entradas ordenadas por su clave (la clave debe implementar Comparable).

+1

Yo diría que esta respuesta es incorrecta. 'LinkedHashMap's no están ordenados por sí mismos, ni en la clave ni en el valor. Según [documentación de JavaSE 7] (https://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html), la única garantía otorgada es mantener el orden de iteración de las claves: "[ ...] normalmente el orden en que se insertaron las claves en el mapa (orden de inserción) ". No dice nada sobre clasificar los datos (o claves). – dbm

+1

Lo que Shayan_Aryan probablemente significa es el TreeMap estándar o algo así como ConcurrentSkipListMap, consulte https://docs.oracle.com/javase/8/docs/api/java/util/AbstractMap.html – Karussell

+0

@Kussell sí, gracias. Me refería exactamente a eso. He actualizado mi respuesta. –

2

Una pequeña modificación a @ punto-en la respuesta de Karussell es que también la documentación propia del método valueAt() sugiere un orden de clasificación (en las teclas):

[...] valueAt(0) devolverá el valor asociado con la clave más pequeña y valueAt(size()-1) devolverá el valor asociado con la clave más grande.

Una descripción similar se da para el método keyAt().

0

Por favor, compruebe mi solución, ordenados por claves:

private static SparseIntArray sFactorsMap = new SparseIntArray();  

    private static void sortMap() { 
     SparseIntArray sortedSparseIntArray = new SparseIntArray(); 
     while (sFactorsMap.size() > 0) { 
      int min = Integer.MAX_VALUE; 
      for (int i = 0; i < sFactorsMap.size(); i++) { 
       if (sFactorsMap.keyAt(i) <= min) { 
        min = sFactorsMap.keyAt(i); 
       } 
      } 
      sortedSparseIntArray.put(min, sFactorsMap.get(min)); 
      sFactorsMap.removeAt(sFactorsMap.indexOfKey(min)); 
     } 
     sFactorsMap = sortedSparseIntArray; 
    }