0

El propósito del programa es crear un Simulador de Vida Marina (a grandes rasgos).

Mi problema es el siguiente:

Tengo una clase abstracta llamada AnimalMarino que define unos cuantos metodos, entre ellos este:

public abstract int getVelocidad();

Este método devuelve un entero. Hasta aqui todo bien. Después de varias cosas más, debo implementar la alimentación, donde el estamento superior de la piramide come del inmediatamente inferior, y come al mas lento. Mi idea entonces, ha sido ordenar el vector de los animales afectados segun la velocidad para asi seleccionar cuales seran los que menos suerte tengan y sean devorados. Para ordenar el vector, he pensado en usar quicksort:

/**
 * quicksort (Vector<AnimalMarino>).
 * Metodo que ordena un vector de Animales Marinos segun su velocidad
 * @param v Vector a ordenar
 */
private void quicksort(Vector<AnimalMarino> v) {
    this.partition(v, 0, v.size()-1);
}

Procesamiento de la partición:

/**
 * partition (Vector<AnimalMarino>,int,int).
 * Funcion auxiliar que ordena una particion de quicksort.
 * @param v     Vector a ordenar
 * @param izq   Indice izquierdo
 * @param der   Indice derecho
 */
private void partition(Vector<AnimalMarino> v, int izq, int der) {
    int i, j;
    int piv;          ///< Pivote. Será la velocidad sobre la que pivotará
    AnimalMarino aux;

    piv = v.elementAt((izq+der)/2).getVelocidad();
    i = izq;
    j = der;

    while (i <= j){
        while(v.elementAt(i).getVelocidad() < piv)
            i++;
        while(v.elementAt(j).getVelocidad() > piv)
            j--;

        if(i < j){
            aux = v.elementAt(i);
            v.removeElementAt(i);
            v.add(i, v.elementAt(j));
            v.remove(j);
            v.add(j, v.elementAt(i));
            i++;
            j--;
        } else{
            if (i == j){
                i++;
                j--;
            }
        }
    }

    if (izq < j)
        this.partition(v, izq, j);
    else if (i < der)
        this.partition(v, i, der);
}

Mi pregunta es: este vector que le estoy pasando, ¿se modificará al final del todo, o se quedará igual? ¿Voy a necesitar pedir que se devuelva el vector ordenado o no es necesario? Gracias de antemano.

jasilva
  • 4,972
  • 6
  • 29
  • 45
Slifer Dragon
  • 215
  • 1
  • 12
  • 6
    Yo creo que en lugar de usar `Vector` (que está técnicamente depreciada) usas `List` con `ArrayList` como implementación y llamas al método `List#sort` el cual ordena tus elementos usando un quicksort optimizado. Y si usas Java 8, puedes hacerlo tan simple como: `list.sort((x,y) -> Integer.compare(x.getVelocidad(), y.getVelocidad()));` –  Nov 07 '16 at 20:04
  • La cuestion es que el algoritmo quicksort es un requisito (menor) del programa. Algo así como que da mas puntos implementarlo, vaya. – Slifer Dragon Nov 08 '16 at 07:42
  • La respuesta que has aceptado es errónea. Revisa si de verdad te ha ayudado o sólo ha sonado la flauta. – Awes0meM4n Nov 08 '16 at 12:22
  • @Awes0meM4n es errónea pero no por lo que dices. –  Nov 08 '16 at 13:06
  • @LuiggiMendoza Según [wikipedia](https://es.wikipedia.org/wiki/Argumento_(inform%C3%A1tica)) por coger un ejemplo, describe exactamente lo que he dicho. Se pasa la referencia, el puntero, y se trabaja con ella. En [StackOverflow](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value) hay una discusión parecida y se llega a la misma conclusión. El problema está en cómo se llama y se traduce del inglés. Lo importante es el comportamiento que digo, y ese es correcto y la respuesta es incorrecta. Si tienes alguna explicación adicional me gustaría aprenderla. – Awes0meM4n Nov 08 '16 at 17:08

1 Answers1

1

En java los parámetros se pasan por valor, lo que significa que se hace una copia del objeto. Pero debes llevar cuidado porque se hace una copia superficial y usando los métodos se puede modificar el estado del objeto pasado como parámetro

Mauricio
  • 66
  • 3
  • **En java los objetos se pasan por referencia, no por valor**. Si el objeto que se pasa por parámetro se modifica se queda modificado. No se hace ninguna copia superficial, sólo se pasa la referencia (puntero) a ese objeto. Si se quiere trabajar con un objeto sin que se modifique fuera de un método hay que hacer una copia _manualmente_ de ese objeto y sólo usar al parámetro para recoger los datos. – Awes0meM4n Nov 08 '16 at 12:20
  • @Awes0meM4n estás equivocado, en Java solo existe paso por valor, nada pasa por referencia. Sucede que lomque envías es una copia del valor de la referencia a tu objeto y **su estado puede ser alterado**. Sin embargo, no creo que esto sea lo único relevante para responder la pregunta. –  Nov 08 '16 at 13:06
  • @LuiggiMendoza Según [wikipedia](https://es.wikipedia.org/wiki/Argumento_(inform%C3%A1tica)) por coger un ejemplo, describe exactamente lo que he dicho. Se pasa la referencia, el puntero, y se trabaja con ella. En [StackOverflow](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value) hay una discusión parecida y se llega a la misma conclusión. El problema está en cómo se llama y se traduce del inglés. Lo importante es el comportamiento que digo, y ese es correcto y la respuesta es incorrecta. – Awes0meM4n Nov 08 '16 at 17:07
  • @Awes0meM4n lo importante es que Java es paso **por valor** solamente. También he leído esa pregunta hace mucho tiempo, y las dos respuestas más votadas lo dicen de manera literal (a menos que tengas problemas con el inglés). 1a respuesta: *Java is always **pass-by-value*** => Java es siempre **paso-por-valor**. 2a respuesta: *The Java Spec says that everything in Java is pass-by-value. There is no such thing as "pass-by-reference" in Java.* => La Especificación Java dice que todo en Java se pasa por valor. No existe nada como "paso por referencia" en Java. –  Nov 08 '16 at 19:23
  • @LuiggiMendoza Lo importante no es el apellido **por valor** como dices, lo importante es cómo funciona. Puedes verlo en el [punto 4.3.1 de java](http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.3.1). Hay otros comentarios de donde traes los tuyos que no pones como _"What's confusing is that object references are actually pointers. In the beginning SUN called them pointers. Then marketing informed that "pointer" was a bad word. But you still see the "correct" nomenclature in NullPointerException"_ y hay otros más. Lo importante es cómo funciona y esta respuesta es erronea. – Awes0meM4n Nov 08 '16 at 21:06
  • @Awes0meM4n la respuesta es errónea pero no por la razón que dices. Java sigue siendo pase por valor y no por referencia. Un ejemplo de pase por referencia es [este](https://www.tutorialspoint.com/cplusplus/cpp_function_call_by_reference.htm). En Java **no hay manera** de conseguirlo usando lo expuesto allí. –  Nov 08 '16 at 21:12
  • @LuiggiMendoza Por favor no pongas más ejemplos de cómo se llaman las cosas porque por cada uno que pongas te puedo poner yo otro y quiero dejar bien claro que no es lo importante. Si la respuesta es erronea **por algo** en vez decirme que no tengo razón explica por qué es errónea que seguro que estamos de acuerdo, pero explícalo, no sólo digas que no se llama así de nuevo. – Awes0meM4n Nov 08 '16 at 21:16
  • @Awes0meM4n Java es paso por valor. Es todo lo que voy a decir. Demuéstrame que me equivoco publicando una respuesta. Y pienso que esta respuesta es equivocada porque no se hace ninguna copia del objeto, lo que se copia es el valor de la referencia del objeto, de manera que al pasar como argumento al método se puede alterar su estado. No hay necesidad de "tener cuidado" si se entienden bien estos conceptos. –  Nov 08 '16 at 21:18
  • @LuiggiMendoza Si no te convenzo de lo que digo con el siguiente enlace es que tienes un problema contigo mismo. [Es una pregunta tuya](http://es.stackoverflow.com/questions/1493/cu%c3%a1l-es-la-diferencia-entre-paso-de-variables-por-valor-y-por-referencia) (y encima con la que más votos has recibido) preguntando exactamente lo que estamos hablando y donde **aceptaste una respuesta que dice justo lo que yo digo y lo contrario de lo que tu dices**. Eso sí que es para explicarlo. – Awes0meM4n Nov 08 '16 at 21:26