¿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.
¿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.
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.
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()
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
Esto definitivamente arruinará la asignación de claves y valores. – nkr
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.
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).
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
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
@Kussell sí, gracias. Me refería exactamente a eso. He actualizado mi respuesta. –
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 yvalueAt(size()-1)
devolverá el valor asociado con la clave más grande.
Una descripción similar se da para el método keyAt()
.
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;
}
¿Por qué quieres a solucionar el problema? Las teclas no cambian y 'SparseArray' no implementa' Iterable'. – nkr
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
@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