Inserción de un elemento en una lista ordenada
Ok, estoy usando getSharedPreferences para almacenar mi puntuación alta pero antes de llenarlo quería ordenar las puntuaciones en orden ascendente a través de y matriz, pero si encuentra una puntuación menor que en la primera pos, entonces no va a comprobar el resto para ¿el mas pequeño?
//function to add score to array and sort it public void addscoretoarray(int mScore){ for(int pos = 0; pos< score.length; pos++){ if(score[pos] > mScore){ //do nothing }else { //Add the score into that position score[pos] = mScore; break; } } sortArray(score); }
¿Debo llamar a sortArray () antes y después del bucle para solucionar este problema o hay un método mejor para lograr los mismos resultados?
- Array detecta sólo una parte de una palabra de entrada en lugar de toda la palabra
- ¿Mostrar caracteres unicode en android?
- Svg archivos de representación en android
- Android no puede cargar la imagen orientada correcta desde la galería
- Creación de vínculos duros y enlaces simbólicos en Android
También debo mencionar que la función sortArray (puntuación) es simplemente llamar Arrays.sort (puntuación) donde puntuación es una matriz de mScore
EDIT: basado en lo que @Vincent Ramdhanie publicado he revisado la publicación:
public void addscoretoarray(int mScore){ int pos = score.length; //sort the array (in ascending order) sortArray(score); //go though the array( in descending order) and check for a place that suits the conditions while(pos>=0 && score[pos] > mScore){ pos--; //do nothing as score[pos] is larger than mScore } //so once a pos is found (eg broke out of the while loop) //check that it is still in the list if(pos >= 0){ //if it is then move everything down 1 position for(int i = 0; i < pos; i++){ score[i] = score[i+1]; } //replace the initial pos with the new score score[pos] = mScore; } }
Sigo creyendo que caerá de la lista cuando en el for(int i = 0; i < pos; i++){
loop.
- Error NumberFormatException
- Al crear una intención de Android y especificar la actividad de destino, ¿cuál es esta sintaxis ".class"?
- Convertir Java a iOS
- Descargar un pdf grande con jsoup
- Lanzar null pointerException en Timer.Schedule ();
- Usar putExtra para pasar valores al servicio de intenciones
- Java, android, resolver un url, obtener redireccionado uri
- Clase de robot como clases para android
¿Por qué no mantener la matriz de resultados clasificados. Así que su puntuación de agregar a la matriz asumirá que la matriz está ordenada en orden descendente todo el tiempo. La nueva puntuación a insertar simplemente empujar la puntuación más baja de la matriz como se inserta. A continuación, puede utilizar un algoritmo de inserción algo como esto:
insertScore(int[] scores, int mscore){ //find insert point int i = 0; while(i < scores.length && scores[i] > mscore){ i++; } if(i < scores.length){ //you found a place to insert the score for(int j = scores.length-1; j > i; j--){ scores[j] = scores[j - 1]; } scores[i] = mscore; } }
En este caso no hay necesidad de recurrir a la matriz.
Si he entendido su correctamente entonces sugiero esto
int[] a1 = { 1, 2, 3, 4, 6 }; int mScore = 5; int[] a2 = new int[a1.length + 1]; Arrays.sort(a1); int p = Arrays.binarySearch(a1, mScore); if (p < 0) { p = -p - 1; System.arraycopy(a1, 0, a2, 0, p); System.arraycopy(a1, p, a2, p + 1, a1.length - p); a2[p] = mScore; } System.out.println(Arrays.toString(a2));
salida
[1, 2, 3, 4, 5, 6]
Tenga en cuenta que sólo inserta valores únicos
Ver javadoc a @return de binarySearch :
Devuelve el índice de la clave de búsqueda, si está contenido en la lista; de lo contrario, (- (punto de inserción) – 1). El punto de inserción se define como el punto en el que la clave se insertaría en la lista: el índice del primer elemento mayor que la clave o list.size () si todos los elementos de la lista son menores que la clave especificada . Tenga en cuenta que esto garantiza que el valor devuelto será> = 0 si y sólo si se encuentra la clave.
public void addscoretoarray(int mScore){ for(int pos = 0; pos< score.length; pos++){ if(score[pos] > mScore){ //do nothing }else { //Add the score into that position score[pos] = mScore; break; } } sortArray(score); }
hay algunos errores importantes en el código.
-
score[pos] = mScore;
en esta sentencia, está asignandomScore
en la posiciónpos
que dará lugar a que el valor almacenado enpos
se pierda. -
Si está utilizando una matriz, entonces para almacenar cualquier elemento entre, necesita mover todos los elementos restantes 1 posición a la derecha, que no está haciendo aquí.
-
score[pos] = mScore; break;
la ruptura romperá el lazo en la primera iteración misma, después de almacenar el elemento en pos.
Sugerencia:
Utilice arraylist en lugar de arreglo nativo. Pseudocódigo modificado:
public void addscoretoarray(int mScore){ int index = getFirstIndexOfScoreGreaterThanmScore(); // need to implement it if(index == -1){ // no element greater than mscore score.add(mScore); }else{ score.add(index,mScore); } // sortArray(score); // no need to call this if the list is initially empty as the insertion will be in sorted order itself if(score.length == maxSize){ //do whateverwhen the list is full as per your requirements } }
- Borrar la actividad de la pila en el botón Atrás presionado
- Envolver un ListView dentro de un LinearLayout