Error de mediana de Java

Necesito ayuda con un fragmento de código que estoy escribiendo. Quiero calcular la mediana de una matriz. Inicialmente, los tipos eran todos enteros y calculó la mediana con división de enteros, lo que me dio una respuesta incorrecta. Cambié todo a dobles, pero recibo un error de discrepancia de tipo que dice que no puedo convertir dobles a enteros, lo que realmente no tiene sentido. ¿Alguien puede ayudar? Este es mi código:

public class MedianTest {

   public static void main(String[] args) {

      double median = 0;
      double myValues[] = { 1, 2, 3, 4 };

      double arrayHalfOdd = ((myValues.length - 1) / 2) + 1;
      double arrayHalfEven = ((myValues.length - 1) / 2);

      if ((myValues.length - 1) % 2 == 0) {
         median = (myValues[arrayHalfEven] + myValues[arrayHalfEven + 1]) / 2;
      } else {
         median = myValues[arrayHalfOdd];
      }
      System.out.print(median);
   }

}

los errores están en myValues[arrayHalfEven] y myValues[arrayHalfOdd]

Por cierto esto NO ES tarea

preguntado el 09 de marzo de 12 a las 23:03

No olvide hacer que su código sea seguro contra listas de solo 1 elemento... -

5 Respuestas

respuesta final:

    if (myValues.length == 0) {
        throw new IllegalStateException();
    }
    else if (myValues.length == 1) {
        return myValues[0];
    }
    else {
        int halfRoundedUp = myValues.length / 2;
        if (myValues.length % 2 == 0) { // even count, average the middle values
            return (myValues[halfRoundedUp - 1] + myValues[halfRoundedUp]) / 2;
        }
        else { // odd, take the middle value
            return myValues[halfRoundedUp];
        }
    }

respondido 09 mar '12, 23:03

No puede usar un doble como índice de matriz: arrayHalfOdd y arrayHalfEven

Haz ints a esos tipos.

respondido 09 mar '12, 23:03

está indexando en una matriz usando valores dobles arrayHalfEven y arrayHalfOdd.

respondido 09 mar '12, 23:03

Si te entendí bien, puedes usar Math.round(doble d) o Math.trunc(doble d);

int arrayHalfOdd = Math.round(((myValues.length - 1 ) / 2)) + 1;
int arrayHalfEven = Math.round(((myValues.length - 1 ) / 2));

respondido 09 mar '12, 23:03

Esta línea

median = (myValues[arrayHalfEven] + myValues[arrayHalfEven + 1]) / 2;

y esta linea

median = myValues[arrayHalfOdd];

están utilizando sus variables dobles arrayHalfEven y arrayHalfOdd como índices de matriz. Si el compilador permitiera índices de matriz doble, podría intentar acceder a una posición en un índice de matriz no entero (por ejemplo, matriz [1.5]) que causaría complicaciones locas de acceso a la memoria. Entonces, en su lugar, arroja un error.

Afortunadamente, el tipo de arrayHalfEven y arrayHalfOdd no afecta si el compilador usa la división de enteros.

La división de enteros solo ocurrirá cuando ambos el numerador y el denominador de una ecuación son números enteros. Los índices de la matriz no forman parte del numerador ni del denominador; son seleccionar el numerador de su matriz.

Entonces, si los elementos de la matriz (los numeradores) son dobles, no obtendrá una división entera. Si desea que sean números enteros, aún puede evitar la división de enteros haciendo que su denominador literal sea un doble, así:

median = (myValues[arrayHalfEven] + myValues[arrayHalfEven + 1]) / 2.0;

Entonces no obtendrá la división de enteros incluso si los elementos de la matriz son enteros.

respondido 10 mar '12, 00:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.