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?

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.

¿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.

  1. score[pos] = mScore; en esta sentencia, está asignando mScore en la posición pos que dará lugar a que el valor almacenado en pos se pierda.

  2. 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í.

  3. 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 } } 
  • Cómo combinar mapas de bits en android?
  • Problema de análisis de tiempo en Android
  • (Android) ¿Cómo obtengo SmartPhone ScreenWidth y Height?
  • Java - Línea aleatoria leer
  • Lona de Android, múltiples rutas con diferentes cantidades de zoom
  • Asynchronous socket I / O en Android
  • ¿Cómo leer eficientemente un objeto Bitmap en una matriz de números enteros bidimensionales?
  • Almacenamiento de un recurso de mapa de bits en una variable estática
  • ¿Puedo crear una aplicación web para ser utilizada en teléfonos inteligentes sin Internet? ¿Cómo?
  • Gradle Método DSL no encontrado: storeFile ()
  • Detección de Android de desinstalación e intención abierta
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.