[Hilo Oficial II] Java

Puyover escribió:
Puyover escribió:Tengo un problemilla... Estoy intentando hacer un programa que me calcule las raices de una función mediante el método de newton y vale, funciona perfectamente... si no fuera por un pequeño detalle.

Os pongo el código y una captura del error:
for (i = 0; i < 21; i++) {
            expresionO = funcion(s);
            expresionDerivada = derivada(s);

            expresionS = new Format("%.2E").format(expresionO);
            expresionDS = new Format("%.2E").format(expresionDerivada);

            if (i < 10) {
               buffer += i + ".  " + formatea.format(s) + "      "
                     + expresionS + "\t" + expresionDS + "\n";
            } else {
               buffer += i + ". " + formatea.format(s) + "      "
                     + expresionS + "\t" + expresionDS + "\n";
            }

            sant = s;
            s = (Double) (s - expresionO / expresionDerivada);

            salidaArea.setText("");

            if (s == sant) {
               if (i < 10) {
                  buffer += i + 1 + ".  " + formatea.format(s) + "      "
                        + expresionS + "\t" + expresionDS + "\n";
               } else {
                  buffer += i + 1 + ". " + formatea.format(s) + "      "
                        + expresionS + "\t" + expresionDS + "\n";
               }
               break;
            }

Imagen
Como veis en las dos últimas líneas f(s(n)) vale 0.00E+000 cuando debería de valer 4.44E-16 y la cosa es que las demás operaciones las hace bien el cachondo ¬_¬

He de decir que uso dos librerías externas: JEP (Java Expresion Parser) y Format, que sirven para reconocer expresiones matemáticas y formatear la salida respectivamente. Esas funcionan perfectamente y ahí no está el problema porque hasta con un println simple me muestra 0.0000000000000000 -.-U

Y por mas que le doy vueltas no caigo en el error y me está sacando ya de quicio cawento

A ver si podéis iluminarme >.<


Me autocito diciendo que es la cosa mas rara que me ha pasado en la vida y que solo presenta ese "problema" (lo pongo entre comillas porque por dentro el programa funciona perfectamente y las operaciones las hace correctamente) en las funciones polinomiales del tipo: x + x + x + ... + n (donde n es una constante y las x son variables (da igual cuantas x pongas)).

Aunque viendo esto me hace pensar que puede ser el parser :/
Voy a hacer unas pruebas y edito.

EDITO: Nada, no es el parser. Si meto la fórmula directamente en el código fuente sigue dándome el mismo error. En fin lo dejaré así y ya está -.-U

Me re-requoteo diciendo que creo que ya se porque pasa esto. Si miráis esta imagen que he hecho con Derive:

Imagen

Veis que en efecto da 0 con una precisión de 9 decimales...
Sin embargo si los aumento a 32 por ejemplo, si que muestra el valor correcto. Creo que eso es lo que me puede estar pasando en el programa. Uso doubles y he probado con BigDecimal y nada... creo que el problema va a estar en el maldito parseador que ya me está tocando la moral.

Hago unas pruebas y edito...
podrias poner el codigo hecho con Bigdecimal?
y si la funcion no es muy larga ponla entera en vez del trozo
xgc1986 escribió:podrias poner el codigo hecho con Bigdecimal?
y si la funcion no es muy larga ponla entera en vez del trozo

Siento la tardanza pero no he podido modificar el código antes. No se como lo hice la otra vez en BigDecimal que lo hago ahora y me salta una excepción de tipo:
Non-terminating decimal expansion; no exact representable decimal result.
en la instrucción:
s = sant.subtract(expresionO.divide(expresionDerivada));

Aquí pongo el código completo:

private void resultadosButton1ActionPerformed(java.awt.event.ActionEvent evt) {
      BigDecimal s = new BigDecimal(Double.parseDouble(s0Field.getText()));
      BigDecimal sant = new BigDecimal(-1);
      String expresionS;
      String expresionDS;
      BigDecimal expresionDerivada = new BigDecimal(-1);
      BigDecimal expresionO = new BigDecimal(-1); // Expresión original
      DefaultTableModel modelo = (DefaultTableModel) jTable1.getModel();
      buffer = "";
      
      if (modelo.getRowCount() != 0) {
         for (int i = modelo.getRowCount() - 1; i >= 0; i--) {
            modelo.removeRow(i);
         }
      }
      
      try {
         for (int i = 0; i < 100; i++) {
            expresionO = funcion(s);
            expresionDerivada = derivada(s);

            expresionS = expresionO.toString();//new Format("%.2E").format(expresionO);
            expresionDS = expresionDerivada.toString();//new Format("%.2E").format(expresionDerivada);
            
            // Salida de datos por la tabla
            //*****************************************************
            modelo.addRow(new Vector());
            jTable1.setValueAt(i, i, 0);
            //if (s < 0) {
               jTable1.setValueAt(formatea.format(s), i, 1);
            /*} else {
               jTable1.setValueAt("+" + formatea.format(s), i, 1);
            }*/
            //if (expresionO < 0) {
               jTable1.setValueAt(expresionS, i, 2);
            /*} else {
               jTable1.setValueAt("+" + expresionS, i, 2);
            }*/
            //if (expresionDerivada < 0) {
               jTable1.setValueAt(expresionDS, i, 3);
            /*} else {
               jTable1.setValueAt("+" + expresionDS, i, 3);
            }*/
            //*****************************************************

            sant = s;
            s = sant.subtract(expresionO.divide(expresionDerivada));
            
            if (s.equals(sant)) {
               // Salida de datos por la tabla (el del último miembro)
               //*****************************************************
               modelo.addRow(new Vector());
               jTable1.setValueAt(i+1, i+1, 0);
               //if (s < 0) {
                  jTable1.setValueAt(formatea.format(s), i+1, 1);
               /*} else {
                  jTable1.setValueAt("+" + formatea.format(s), i+1, 1);
               }*/
               //if (expresionO < 0) {
                  jTable1.setValueAt(expresionS, i+1, 2);
               /*} else {
                  jTable1.setValueAt("+" + expresionS, i+1, 2);
               }*/
               //if (expresionDerivada < 0) {
                  jTable1.setValueAt(expresionDS, i+1, 3);
               /*} else {
                  jTable1.setValueAt("+" + expresionDS, i+1, 3);
               }*/
               //*****************************************************
               
               break;
            }
         }
         
         if (s.equals(sant)) {
            buffer = "Solucion aproximada: " + formatea.format(s);
            salidaField.setText(buffer);
         } else {
            buffer = "Tras 100 iteraciones la sucesion no converge";
            salidaField.setText(buffer);
         }

         resultadosNewtonDialog.pack();
         resultadosNewtonDialog.setVisible(true);
      } catch (ParseException e) {
         JOptionPane
               .showMessageDialog(
                     null,
                     "Comprueba que hallas introducido la formula correctamente",
                     "Error", JOptionPane.ERROR_MESSAGE);
      }
   }

private BigDecimal funcion(BigDecimal x) throws ParseException {
      BigDecimal expresionR;
      jep.addVariable("x", x);
      expresion = jep.parse(expresionField.getText());
      expresionR = BigDecimal.valueOf((Double) jep.evaluate(expresion));
      return expresionR;
   }

private BigDecimal derivada(BigDecimal x) throws ParseException {
      BigDecimal expresionR;
      jep.addVariable("x", x);
      expresionD = jep.parse(expresionDerivadaField.getText());
      expresionR = BigDecimal.valueOf((Double) jep.evaluate(expresionD));
      return expresionR;
   }


De todas formas es una tontería hacerlo con BigDecimal porque en la linea:
expresionR = BigDecimal.valueOf((Double) jep.evaluate(expresionD));
hago un cast del parser a Double... si lo pudiera hacer a BigDecimal entonces quizá funcionaría pero el parser no tiene ningún método para pasar a BigDecimal, y desconozco si existe otra forma de hacerlo :/
Un saludo!
en el primer codigo que me has puesto, he visto por que te sale el error, y es por que esta variable cuando la creas, la haces a partir de un double, entonces pierdes pecision

por ejemplo:

MAL -> BigDecimal d = new BigDecimal(20.51) // d = 20.510000000000001563194018672220408916473388671875
BIEN -> BigDecimal d = new BigDecimal("20.51") // d = 20.51

tienes que evitar contruir un BigDecimal a partir de un double, hazlo de un string

entonces en la segunda linea del primer codigo has de poner

BigDecimal s = new BigDecimal(s0Field.getText());

Y sobre los codigos 2 y 3 le linea:
expresionR = BigDecimal.valueOf((Double) jep.evaluate(expresionD));

pues no se que devuelve jep.evaluate(expresionID), pero si devuelve un String haz
expresionR = new BigDecimal(jep.evaluate(expresionD));

si no devuelve un String dimelo miramos otra forma de hacer esta parte

ya no he visto nada mas ya contaras que tal va ahora


edito la funcion divide de BigDecimal ademas puedes elegir a cuantas decimales quieres que te redondee, y que tipo de redondeo
xxxxx.divide(yyyyy,50,RoundingMode.HALF_EVEN));
xgc1986 escribió:en el primer codigo que me has puesto, he visto por que te sale el error, y es por que esta variable cuando la creas, la haces a partir de un double, entonces pierdes pecision

por ejemplo:

MAL -> BigDecimal d = new BigDecimal(20.51) // d = 20.510000000000001563194018672220408916473388671875
BIEN -> BigDecimal d = new BigDecimal("20.51") // d = 20.51

tienes que evitar contruir un BigDecimal a partir de un double, hazlo de un string

entonces en la segunda linea del primer codigo has de poner

BigDecimal s = new BigDecimal(s0Field.getText());

Y sobre los codigos 2 y 3 le linea:
expresionR = BigDecimal.valueOf((Double) jep.evaluate(expresionD));

pues no se que devuelve jep.evaluate(expresionID), pero si devuelve un String haz
expresionR = new BigDecimal(jep.evaluate(expresionD));

si no devuelve un String dimelo miramos otra forma de hacer esta parte

ya no he visto nada mas ya contaras que tal va ahora


edito la funcion divide de BigDecimal ademas puedes elegir a cuantas decimales quieres que te redondee, y que tipo de redondeo
xxxxx.divide(yyyyy,50,RoundingMode.HALF_EVEN));


Vale, jep.evaluate(expresionID) devuelve un objeto Double. Hago lo que me has dicho invocándole el .toString() y funciona perfecto, coge el número y se supone que ya está en BigDecimal (lo imprimo y es correcto). Luego lo del método divide con el redondeo se lo he añadido y funciona bien también.

Ahora... ejecuto el programa:

Imagen

Y me sigue diciendo que las dos últimas valen 0.0 [buuuaaaa] [buuuaaaa] [buuuaaaa] [buuuaaaa]
Ya parece esto cachondeo o algo -.-U

Muchas gracias por la ayuda, tampoco te preocupes si no va. Si no lo arreglo pues se queda así y ya está. Es algo que hago "por amor al arte" como quien dice, no es una práctica ni nada de eso xD

Un saludo!
lo mas probable es que en algun momento utlizas double o Double. Yo lo que haria seria intentar eliminar todos y usar BigDecimal.

Esto deberia solucionarlo, si no, entonces ya no se me ocurre nada mas
Hola chicos,
Tengo un par de dudas. Como sabeis adquiri el Core Java 2 en ingles en Amazon. No me queda muy clara la idea de interface i clase abstracta. Podriais explicarmela un poco mas?

Gracias.
oscarmu escribió:Hola chicos,
Tengo un par de dudas. Como sabeis adquiri el Core Java 2 en ingles en Amazon. No me queda muy clara la idea de interface i clase abstracta. Podriais explicarmela un poco mas?

Gracias.

Pues no tengo mucha idea, aun no las he dado en la carrera, pero según he leido por ahí una interfaz, al crear una clase que la implemente, debe contener obligatoriamente ciertos métodos para redefinirla... no me hagas mucho caso tampoco que aun no he hecho nada con ellas, fuera de implementar la interfaz Runnable [+risas]

@xgc1986 pues nada se queda así porque le he estado echando un ojo por si encontraba alguna línea donde donde se hiciera un cast a algún tipo mas pequeño (para ver una posible pérdida de precisión) y nada así que lo doy por terminado que ya estoy cansado de comerme la cabeza con esto. Aquí lo dejo para el quiera descargárselo. Si quieres las fuentes pídemelas por privado y te las paso xD
oscarmu escribió:Hola chicos,
Tengo un par de dudas. Como sabeis adquiri el Core Java 2 en ingles en Amazon. No me queda muy clara la idea de interface i clase abstracta. Podriais explicarmela un poco mas?

Gracias.


Son 2 conceptos muy parecidos pero a la vez diferentes...

Una clase abstracta es una clase que define métodos y atributos. Dichos métodos pueden ser abstractos o no. ¿Qué significa abstracto? Básicamente que no le has escrito el código, que están vacíos.

¿Qué utilidad tiene esto? Pues obviamente una clase abstracta (de la cual no puedes crear instancias) sirve de clase base para otras muchas clases...

Imagina que haces un juego de lucha, tu quieres tener una variedad de clases tipo Arma, entonces lo normal es tener una clase base del tipo "Arma" y de ahi heredar pues un conjunto de clases en plan, espada, hacha... Como comprendrás, lo que tu quieres instanciar es o bien el hacha o bien la espada, pero no "Arma", ya que "Arma" en si no es nada real (en el sentido de que arma es un concepto, el objeto real seria la espada o el hacha). La clase "Arma" lo que tendrá será un comportamiento básico que compartirán todas las Armas, así que escribes ahi una combinación de métodos normales y abstractos (los normales para cosas que hacen todas las armas por igual y los abstractos para cosas que hacen todas las armas, pero que cada arma concreta lo hace a su forma) y marcas la clase como abstracta para que no pueda ser inicializada. Todo hijo de Arma tiene que escribir el código de cada método abstracto.


Por otro lado, una interfaz es parecida a una clase abstracta. Una interfaz solo puede contener una serie de definiciones de métodos (o sea, el método sin código) y cada clase que implemente dicha interfaz necesita por fuerza escribir el código de cada método de la interfaz.

Te preguntarás: ¿Cuando una clase abstracta y cuando una interfaz? En Java sólo puedes heredar de una clase, sin embargo puedes implementar cuantas interfaces quieras.

La idea es que las interfaces definen un comportamiento, y cuando necesites que una clase obtenga ese comportamiento, le implementas dicha interfaz.

Por ejemplo, si necesitas que una clase se pueda comparar con otra necesitas que implemente la interfaz Comparable, pues dicha interfaz contiene los métodos necesarios para dicho comportamiento. Si necesitas poder serializar una clase, pues lo mismo, implementas Serializable para darle a esa clase el comportamiento necesario.

No sé, así a bote pronto... Si creas clases de coches y algunos son descapotables, dichos coches pueden implementar una interfaz llamada Descapotable que contenga el comportamiento del mismo.

Éstas cosas son bastante útiles cuando tengais algo más de experiencia.

Siguiendo el ejemplo de los coches descapotables...

Si tienes un método que haga algo con coches descapotables, lo idóneo es hacer algo en plan:

void metodo(Descapotable coche) { ... }

O sea, colocas la interfaz como parámetro...

Un ejemplo más comun por ejemplo es que si necesitas trabajar con clases con comportamiento de una lista, en vez de usar una implementación concreta, tipo ArrayList, pues usas la interfaz List:

void metodo(List lista) { ... }

Ahi puedes pasar un ArrayList, un Vector, Stack...

O bien si necesitas tu propio tipo de lista, le implementas la interfaz List para que tenga un comportamiento de lista y ya está, ya puedes usarla también en el método anterior...

En resumen, todo esto lo enseña la práctica asi que no os preocupeis si no lo veis aún.
Pues chico, no lo acabo de pillar.
Tengo entendio que cuando quiero crear una clase padre, esta tendra sus metodos. Entonces cuando creo sus hijos(espada...) estos tendran tambien sus metodos. Entonces no entiendo el porque de los metodos abstractos e interficies.

Nose...
Las interfaces y los métodos abstractos van de la mano.

Imagina que tenemos una interfaz que le vamos a llamar Funciones.
Imaginemos una serie de animales, un perro, un gato, un caballo...

Yo puedo hacer esto:

public interface Funciones {

    public void respirar();
    public void caminar();
    public void correr();

}


Ahora esto:
public class Animal implements Funciones {

    public void respirar() {
      //lo que sea
    }

    public void caminar() {
      //lo que sea
    }

    public void correr() {
      //
    }

}

//Como la clase Animal implementa Funciones, o programas los métodos especificados en ella o aquí no compila ni Chuck Norris xD


Y ahora las demás

public class Perro extends Animal {
    //Los métodos definidos en la interfaz están programados en la clase padre, así que no es necesario programarlos aquí, a menos que aquí
    //el método haga algo concreto

    //De igual forma, puedo declarar ahora métodos específicos para el perro
    public void ladrar() {
      System.out.println("guau");
    }

}


Los otros dos animales igual

public class Gato extends Animal {
    //Los métodos definidos en la interfaz están programados en la clase padre, así que no es necesario programarlos aquí, a menos que aquí
    //el método haga algo concreto

    //De igual forma, puedo declarar ahora métodos específicos para el perro
    public void maullar() {
      System.out.println("miau");
    }

}


public class Caballo extends Animal {
    //Los métodos definidos en la interfaz están programados en la clase padre, así que no es necesario programarlos aquí, a menos que aquí
    //el método haga algo concreto

    //De igual forma, puedo declarar ahora métodos específicos para el perro
    public void cocear() {
      System.out.println("Ay, eso duele xD");
    }

}


Y así tienes herencia e interfaces de un plumazo.
Yo creo q lo q no entiende oscarmu es porque usar clases abstractas o interfaces si se puede hacer con una clase normal
Yo solo se un poco pero creo q las clases q se declaran abstractas es porque luego no vas a declarar ningun objeto de esa clase, lo q no termino de pillar es la diferencia entre abstracta e interfaz, es decir, cuando se utiliza una y cuando otra.

Salu2
Auch, parece que mi tochaco de ayer no sirvió para nada jeje.

Se usan clases abstractas en vez de clases normales pues las clases se usan para representar objetos concretos, por ejemplo: Un perro, un gato... O sea, puedes crear una instancia de un perro al cual llamar rufus y que sea con el pelo marroncito. Lo mismo con un gato llamado minino y pelo blanco.

Las clases abstractas no representan objetos concretos, como podría ser "Animal", tu no puedes crear un animal como tal, necesitarías crear un gato o un perro. ¿Para qué las clases abstractas entonces? Pues se usan como clases bases en las jerarquías de clases.

Es tontería tener una clase perro y separadamente otra clase gato, estaría bien que ambas fueran hijas de una clase común que tenga ciertos métodos en común para los gatos y los perros. Esa clase base puede ser o bien una clase normal o bien una abstracta, pero en este caso concreto, una buena clase padre para esas dos podría ser "AnimalCompañia", obviamente no te interesa poder crear instancias de AnimalCompañia puesto que eso no es _nada_ realmente, solo un concepto pero que no tiene representación real, así que la marcas abstracta obligando a los programadores a usar o bien gato o bien perro.

Las clases abstractas se usan para eso, para que sean las clases bases de ciertas jerarquias como la de este ejemplo.

Las interfaces por otro lado y como ya dije, se usan para modelar comportamientos, y eso creo que lo expliqué bien ya en mi otro mensaje.
He vuelto a leer tus dos ultimos mensajes y por lo menos a mi ya me quema mucho mas claro, thanks for the explanation

Salu2
Hola, tengo una duda respecto a arrays, tengo declarado un array de String de dimension 10 por ejemplo, al que le introduzco 4 objetos en sus primeras posiciones, mi pregunta es ¿como puedo crear un metodo que elimine un objeto del array (comparando lo que haya en cada posicion con el String que le de yo en el metodo (borrarContenido (String contenido)) y que a su vez haga que las demas cosas ya guardadas ocupen el espacio vacio?)

Por ejemplo, si en las primeras 4 posiciones del array meto "Juan" "Pedro" "Javier" y "Luis", si luego en el metodo quiero que borre "Pedro", el metodo debe ir por cada posicion comparando si es igual a "Pedro" y si es asi borrarlo y que "Javier" ocupe la posicion de "Pedro" y "Luis" la de Javier claro esta.

Lo de compararlo lo tengo solucionado, pero no se como borrar el objeto de una posicion y luego mover los demas atributos.

Gracias de antemano.
sergimax escribió:Hola, tengo una duda respecto a arrays, tengo declarado un array de String de dimension 10 por ejemplo, al que le introduzco 4 objetos en sus primeras posiciones, mi pregunta es ¿como puedo crear un metodo que elimine un objeto del array (comparando lo que haya en cada posicion con el String que le de yo en el metodo (borrarContenido (String contenido)) y que a su vez haga que las demas cosas ya guardadas ocupen el espacio vacio?)

Por ejemplo, si en las primeras 4 posiciones del array meto "Juan" "Pedro" "Javier" y "Luis", si luego en el metodo quiero que borre "Pedro", el metodo debe ir por cada posicion comparando si es igual a "Pedro" y si es asi borrarlo y que "Javier" ocupe la posicion de "Pedro" y "Luis" la de Javier claro esta.

Lo de compararlo lo tengo solucionado, pero no se como borrar el objeto de una posicion y luego mover los demas atributos.

Gracias de antemano.

Claro pero imagina que mueves todos de lado... que pasa con el último hueco? se queda vacio? Si es así deberías de hacer algo como:

for(int i = 0; i < array.length-1; i++) {
    array[i] = array[i+1];
}
array[array.length-1] = "";


Así se te moverían y el último hueco se quedaría vacío.

Un saludo.

PD: i sería la posición del que quieres eliminar, no tiene que ser necesariamente 0.
sergimax escribió:Hola, tengo una duda respecto a arrays, tengo declarado un array de String de dimension 10 por ejemplo, al que le introduzco 4 objetos en sus primeras posiciones, mi pregunta es ¿como puedo crear un metodo que elimine un objeto del array (comparando lo que haya en cada posicion con el String que le de yo en el metodo (borrarContenido (String contenido)) y que a su vez haga que las demas cosas ya guardadas ocupen el espacio vacio?)

Por ejemplo, si en las primeras 4 posiciones del array meto "Juan" "Pedro" "Javier" y "Luis", si luego en el metodo quiero que borre "Pedro", el metodo debe ir por cada posicion comparando si es igual a "Pedro" y si es asi borrarlo y que "Javier" ocupe la posicion de "Pedro" y "Luis" la de Javier claro esta.

Lo de compararlo lo tengo solucionado, pero no se como borrar el objeto de una posicion y luego mover los demas atributos.

Gracias de antemano.


para borrar el objeto de una posicion utiliza el método

remove(Object); Si quieres borrar el objeto
remove(int); Si quieres borrar según la posición

Para reordenar el array yo lo que haría sería recorrerlo y meterlo en un array ausiliar todo lo "not null" vaciar el original y copiar el ausiliar al original, si es muy grande el vector no es eficiente, pero para eso utilizaría la clase vector y no un array :P
Puyover escribió:Claro pero imagina que mueves todos de lado... que pasa con el último hueco? se queda vacio? Si es así deberías de hacer algo como:

for(int i = 0; i < array.length-1; i++) {
    array[i] = array[i+1];
}
array[array.length-1] = "";


Así se te moverían y el último hueco se quedaría vacío.

Un saludo.

PD: i sería la posición del que quieres eliminar, no tiene que ser necesariamente 0.

Un rato despues de poner la duda se me ocurrio esto mismo, asi que ya esta solucionado para que "elimine" y se desplacen los objetos, gracias de todos modos por la ayuda.

daniel_5 escribió:para borrar el objeto de una posicion utiliza el método

remove(Object); Si quieres borrar el objeto
remove(int); Si quieres borrar según la posición

Para reordenar el array yo lo que haría sería recorrerlo y meterlo en un array ausiliar todo lo "not null" vaciar el original y copiar el ausiliar al original, si es muy grande el vector no es eficiente, pero para eso utilizaría la clase vector y no un array :P

Esto serviria para ArrayList imagino, pero para un Array normal no funciona, al menos eso he comprobado.
sergimax escribió:Esto serviria para ArrayList imagino, pero para un Array normal no funciona, al menos eso he comprobado.


Cierto, para Array no están esos métodos :P di por supuesto que te referias a arrayList :)
Fox escribió:Auch, parece que mi tochaco de ayer no sirvió para nada jeje.

Se usan clases abstractas en vez de clases normales pues las clases se usan para representar objetos concretos, por ejemplo: Un perro, un gato... O sea, puedes crear una instancia de un perro al cual llamar rufus y que sea con el pelo marroncito. Lo mismo con un gato llamado minino y pelo blanco.

Las clases abstractas no representan objetos concretos, como podría ser "Animal", tu no puedes crear un animal como tal, necesitarías crear un gato o un perro. ¿Para qué las clases abstractas entonces? Pues se usan como clases bases en las jerarquías de clases.

Es tontería tener una clase perro y separadamente otra clase gato, estaría bien que ambas fueran hijas de una clase común que tenga ciertos métodos en común para los gatos y los perros. Esa clase base puede ser o bien una clase normal o bien una abstracta, pero en este caso concreto, una buena clase padre para esas dos podría ser "AnimalCompañia", obviamente no te interesa poder crear instancias de AnimalCompañia puesto que eso no es _nada_ realmente, solo un concepto pero que no tiene representación real, así que la marcas abstracta obligando a los programadores a usar o bien gato o bien perro.

Las clases abstractas se usan para eso, para que sean las clases bases de ciertas jerarquias como la de este ejemplo.

Las interfaces por otro lado y como ya dije, se usan para modelar comportamientos, y eso creo que lo expliqué bien ya en mi otro mensaje.


Muchas gracias FOX i muchas gracias a todos.

Aun del todo todo claro no me ha quedado. Pero almenos ahora tengo una idea general. Supongo que toca avanzar un poco.
Buenas, tengo una dudilla.

En c++ cuando heredo de otra clase puedo hacer que todo lo que hereda pase a ser private, protected o normal. Y me gustaria saber si en JAVA tambien se puede, y si se puede, entonces saber como se hace.

El caso es que quiero heredar una clase, pero no me interesa que la gente use las funciones que hereda. Y se me habia ocurrido primero sobreescribir estas clases para que en vez de llamar a la clase al cual heredo, llamen a las mias que no harian nada. Pero lo veo muy costoso ya que son bastantes, y absurdo crear clases que no hacen nada.

Gracias

Edito:
Se me acaba de ocurrir como puedo hacerlo de una manera sencilla, en vez de heredar esa clase, la uso como variable privada. xD
xgc1986 escribió:Buenas, tengo una dudilla.

En c++ cuando heredo de otra clase puedo hacer que todo lo que hereda pase a ser private, protected o normal. Y me gustaria saber si en JAVA tambien se puede, y si se puede, entonces saber como se hace.

El caso es que quiero heredar una clase, pero no me interesa que la gente use las funciones que hereda. Y se me habia ocurrido primero sobreescribir estas clases para que en vez de llamar a la clase al cual heredo, llamen a las mias que no harian nada. Pero lo veo muy costoso ya que son bastantes, y absurdo crear clases que no hacen nada.

Gracias

Edito:
Se me acaba de ocurrir como puedo hacerlo de una manera sencilla, en vez de heredar esa clase, la uso como variable privada. xD


Es igual a C++:

private String nombre;

protected metodo() { ... }

public int edad;

Solo que en C++ se suelen tener secciones en plan:

public:
...

private:
...

etc.

oscarmu escribió:Muchas gracias FOX i muchas gracias a todos.

Aun del todo todo claro no me ha quedado. Pero almenos ahora tengo una idea general. Supongo que toca avanzar un poco.


Como ya dije, experiencia es lo que necesitas, yo tb he tenido esas dudas :)
no me referia a eso, pero es igual ja lo he solucionado.

pero lo que decia era por ejemplo si jo tengo la clase A con una funcion publica que se llama aa();

lo que yo queria era hacer una clase B que hereda de A, pero que todas sus funciones public i protected pasasen a ser private
Una preguntita tonta. De java, basicament, me gustaria crear aplicacions para internet usando los applets. Para eso debo programar la parte visual con AWT, no?

Apartir de aqui, con que software se programa en AWT o Swing? Con netbeans voy bien? O mejor eclipse...? Recomendaciones?

Muchisimas gracias.
oscarmu escribió:Una preguntita tonta. De java, basicament, me gustaria crear aplicacions para internet usando los applets. Para eso debo programar la parte visual con AWT, no?

Apartir de aqui, con que software se programa en AWT o Swing? Con netbeans voy bien? O mejor eclipse...? Recomendaciones?

Muchisimas gracias.

No estoy muy puesto en applets; todo lo que he hecho hasta ahora ha sido aplicaciones de escritorio, sin embargo, yo antes usaba netbeans y eso de que no me dejara tocar las partes de código que yo quisiera me ponía de los nervios, por lo que me pasé a eclipse y con sus respectivos plugins sigo hoy en día y me encanta.

Un saludo.
Puyover escribió:
oscarmu escribió:Una preguntita tonta. De java, basicament, me gustaria crear aplicacions para internet usando los applets. Para eso debo programar la parte visual con AWT, no?

Apartir de aqui, con que software se programa en AWT o Swing? Con netbeans voy bien? O mejor eclipse...? Recomendaciones?

Muchisimas gracias.

No estoy muy puesto en applets; todo lo que he hecho hasta ahora ha sido aplicaciones de escritorio, sin embargo, yo antes usaba netbeans y eso de que no me dejara tocar las partes de código que yo quisiera me ponía de los nervios, por lo que me pasé a eclipse y con sus respectivos plugins sigo hoy en día y me encanta.

Un saludo.


Que tipo de plugins utilizas?

Gracias.
oscarmu escribió:
Puyover escribió:
oscarmu escribió:Una preguntita tonta. De java, basicament, me gustaria crear aplicacions para internet usando los applets. Para eso debo programar la parte visual con AWT, no?

Apartir de aqui, con que software se programa en AWT o Swing? Con netbeans voy bien? O mejor eclipse...? Recomendaciones?

Muchisimas gracias.

No estoy muy puesto en applets; todo lo que he hecho hasta ahora ha sido aplicaciones de escritorio, sin embargo, yo antes usaba netbeans y eso de que no me dejara tocar las partes de código que yo quisiera me ponía de los nervios, por lo que me pasé a eclipse y con sus respectivos plugins sigo hoy en día y me encanta.

Un saludo.


Que tipo de plugins utilizas?

Gracias.


Para programar en java usando swing uso este: http://www.eclipse.org/vep/
Luego también uso para programar para la nds usando C este: http://marketplace.eclipse.org/content/ ... gedbuilder

Un saludo!
cuando intento ejecutar un .jar generado por mi me dice que no se encontro la Main class ,pero en el manifest viene la main class.. ,eso si el classpath: me viene vacio...(esto en windows 7 que tampoco me deja compilar desde la consola habiendo añadido la ruta de la carpeta bin de java ala variable path, en linux no hay problema)
Hola buenas a ver si me podéis echar una mano.
Estoy haciendo un programa simple que simula una inmobiliaria. Lo tengo terminado pero me he encontrado con un par de fallos que se donde están (me lo dice el IDE) pero no se solucionar :S

El error es el siguiente:
Exception in thread "main" java.lang.NullPointerException
  at Vivienda.<init>(Vivienda.java:33)
  at main.main(main.java:13)


Decir que es un programa con varias clases y uso composición.
El error que me marca en la clase Vivienda.java en la línea 33 tengo lo siguiente:
codigo.setnnumero(nnumero);

Donde codigo es otra clase formada por un numero y una letra, y en este caso le quiero mandar un numero.

El otro error en el "main" (es como le llamado a la clase principal. Tengo esto en la línea del error:
Vivienda casa1=new Vivienda(1199,'v',1070,"Casa numero 1");

Lo que hago es crear una vivienda con esos datos como atributos que mando a la clase Vivienda que tiene sus respectivos constructores... :S

A ver si alguien me puede echar una mano. Gracias :)
Iverson88 escribió:Hola buenas a ver si me podéis echar una mano.
Estoy haciendo un programa simple que simula una inmobiliaria. Lo tengo terminado pero me he encontrado con un par de fallos que se donde están (me lo dice el IDE) pero no se solucionar :S

El error es el siguiente:
Exception in thread "main" java.lang.NullPointerException
  at Vivienda.<init>(Vivienda.java:33)
  at main.main(main.java:13)


Decir que es un programa con varias clases y uso composición.
El error que me marca en la clase Vivienda.java en la línea 33 tengo lo siguiente:
codigo.setnnumero(nnumero);

Donde codigo es otra clase formada por un numero y una letra, y en este caso le quiero mandar un numero.

El otro error en el "main" (es como le llamado a la clase principal. Tengo esto en la línea del error:
Vivienda casa1=new Vivienda(1199,'v',1070,"Casa numero 1");

Lo que hago es crear una vivienda con esos datos como atributos que mando a la clase Vivienda que tiene sus respectivos constructores... :S

A ver si alguien me puede echar una mano. Gracias :)

Lo haces todo correctamente :S
El error probablemente esté dentro de la clase.
os copio trozos mas grandes de código o que puedo hacer? tienes alguna sospecha del problema?
El primer error tiene que ser por que no inicializas la variable codigo, de ahi viene el NullPointerException.

El segundo, necesitaria ver mas codigo, o por lo menos saber que error es.

un saludo ;)
Lo acabo de arreglar, se me olvido poner en todos los constructores lo siguiente:
codigo=new Codigo();

gracias por la ayuda :P

otro problema:
Tengo un metodo dentro de la clase Inmobiliaria que tiene que buscar una casa apartir de una descripcion que le digo, por ejemplo:
La casa 1 tiene como descripción: Mansion de la calle adolfo suarez.

Pues yo pido por teclado una descripcion (subcadena), y tiene que buscar en las descripciones de todas las casas para ver si la cadena contiene la subcadena introducida, lo hago de la siguiente manera pero no me devuelve nada :S
//Método de busqueda por descripción.
   void buscar(String cad_des)
   {
      int i=0;
      int j=0;
      int contadorA=0;
      int contadorV=0;
      Vivienda vivienda_a_buscar;
      String descripcion="";
      //Buscamos primero en las viviendas de alquiler
      for(i=0;i<alquiler.size();i++)
      {
         vivienda_a_buscar=(Vivienda)alquiler.elementAt(i);
         descripcion=vivienda_a_buscar.getdes();
         for(j=0;j<descripcion.length();i++)
         {
            while(contadorA!=cad_des.length())
            {
               if(descripcion.charAt(i)==cad_des.charAt(contadorA))
               {
                  contadorA ++;
               }
               else
               {
                  contadorA=0;
               }
            }
            if(contadorA>0)
            {
               System.out.println(alquiler.elementAt(i).toString());
            }
         }
                  
      }
      //Ahora en las de venta
      for(i=0;i<venta.size();i++)
      {
         vivienda_a_buscar=(Vivienda)venta.elementAt(i);
         descripcion=vivienda_a_buscar.getdes();
         for(j=0;j<descripcion.length();i++)
         {
            while(contadorV!=cad_des.length())
            {
               if(descripcion.charAt(i)==cad_des.charAt(contadorV))
               {
                  contadorV ++;
               }
               else
               {
                  contadorV=0;
               }
            }
            if(contadorV>0)
            {
               System.out.println(venta.elementAt(i).toString());
            }
         }
                  
      }
   }
Alguien sabe cómo poner un temporizador que salte de forma periódica?

Saludos.
El_RapEro escribió:Alguien sabe cómo poner un temporizador que salte de forma periódica?

Saludos.


Sí, busca la clase Timer.
Fox escribió:
El_RapEro escribió:Alguien sabe cómo poner un temporizador que salte de forma periódica?

Saludos.


Sí, busca la clase Timer.


Gracias! Ahora busco información de esa clase.

Saludos.
¿Alguien sabe porque el rendimiento del garbage collector es mucho mucho peor en win7 que en cualquier linux? usando el mismo sdk.

Estoy desarrollando una aplicación y para que rule bien en windows7 tengo que iniciarla con algunos argumentos de la VM para el gc, y sin embargo en linux, sin esos argumentos, rula como un tiro.
A ver estoy teniendo un problemilla, de concepto creo yo...
Tengo que hacer un programa en java que administre aeropuertos. Cada aeropuerto tiene sus Compañias, Vuelos y Pasajeros. Vale, este es el diagrama que tengo hecho:

http://i42.tinypic.com/uolmq.jpg

El problema es, que yo en el código instancio las clases así:

// Creamos 2 aeropuertos; uno tendrá 3 compañías y otro 2
      Aeropuerto barajas = new Aeropuerto(3, "Barajas", "Madrid");
      Aeropuerto el_prat = new Aeropuerto(2, "El Prat", "Barcelona");
      
      // Creamos las companias de barajas
      Compania [] compania = new Compania[barajas.getNumCompanias()];
      compania[0] = new Compania(3, 2, "AirEuropa");
      compania[1] = new Compania(2, 1, "Spanair");
      compania[2] = new Compania(1, 2, "Ryanair");


Pero claro... así no están relacionadas. Para relacionarlas tendría que crear las compañías a la vez que creo los aeropuertos, desde el constructor. Pero claro haciéndolo así, usaría el constructor por defecto y luego tendría que establecer cada atributo del objeto con los métodos set... y eso supondrían muchas líneas de código...

Alguna idea de como puedo hacerlo para que los objetos estén relacionados y pueda crearlos directamente mediante su constructor?
No te entiendo muy bien Puyover...

Para empezar, no uses arrays a pelo, eso está muy feo, usa algo del estilo:

ArrayList<Compañia> que es mucho más rápido, más util y más facil de usar.

Yo imagino que podrías hacer algo en plan

Aeropuerto barajas = new Aeropuerto(.....);

ArrayList<Compañia> compañias = new ArrayList<Compañia>();
compañias.add(new Compañia(......));
compañias.add.....

y finalmente

barajas.setCompañias(compañias);


Pero vamos, no sé si estoy entendiendo bien lo que necesitas.
Fox escribió:No te entiendo muy bien Puyover...

Para empezar, no uses arrays a pelo, eso está muy feo, usa algo del estilo:

ArrayList<Compañia> que es mucho más rápido, más util y más facil de usar.

Yo imagino que podrías hacer algo en plan

Aeropuerto barajas = new Aeropuerto(.....);

ArrayList<Compañia> compañias = new ArrayList<Compañia>();
compañias.add(new Compañia(......));
compañias.add.....

y finalmente

barajas.setCompañias(compañias);


Pero vamos, no sé si estoy entendiendo bien lo que necesitas.

Ah mira lo de ArrayList me va a venir al dedo xD
Lo que quiero decir es que, yo no puedo instanciar directamente objetos de la clase Compania (y de ninguna de las siguientes por debajo de Aeropuerto) sin pasar por Aeropuerto. O sea para crear un Pasajero por ejemplo, necesitaría pasar por Aeropuerto, Compania y Vuelo. Lo que no debo hacer es crear Pasajeros directamente porque no estarían relacionados con ningún Vuelo, ni este con ninguna Compania, ni esta con ningún Aeropuerto :S
No se si me explico, es que es un poco raro xD
Puyover escribió:
Fox escribió:No te entiendo muy bien Puyover...

Para empezar, no uses arrays a pelo, eso está muy feo, usa algo del estilo:

ArrayList<Compañia> que es mucho más rápido, más util y más facil de usar.

Yo imagino que podrías hacer algo en plan

Aeropuerto barajas = new Aeropuerto(.....);

ArrayList<Compañia> compañias = new ArrayList<Compañia>();
compañias.add(new Compañia(......));
compañias.add.....

y finalmente

barajas.setCompañias(compañias);


Pero vamos, no sé si estoy entendiendo bien lo que necesitas.

Ah mira lo de ArrayList me va a venir al dedo xD
Lo que quiero decir es que, yo no puedo instanciar directamente objetos de la clase Compania (y de ninguna de las siguientes por debajo de Aeropuerto) sin pasar por Aeropuerto. O sea para crear un Pasajero por ejemplo, necesitaría pasar por Aeropuerto, Compania y Vuelo. Lo que no debo hacer es crear Pasajeros directamente porque no estarían relacionados con ningún Vuelo, ni este con ninguna Compania, ni esta con ningún Aeropuerto :S
No se si me explico, es que es un poco raro xD

Yo por lo que te he entendido tienes que crear una instancia de aeropuerto y si quieres añadir un pasajero para un vuelo de una compañia que opera en dicho aeropuerto, crearlo desde el objeto Aeropuerto... Es eso? Porque me parece una manera asquerosa de programar.
Lo lógico sería crear los objetos independientemente y añadirlos al superobjeto. Si aun así tienes que hacer el sistema de crear los pasajeros desde el aeropuerto, entonces tendrás que ir accediendo a los objetos inferiores del aeropuerto (es decir, desde objAeropuerto accedes a objCompania, desde objCompania accedes a objVuelo y desde objVuelo creas el objPasajero).
Bueno ya marcha esto. He implementado las matrices con ArrayList y he creado nuevos métodos en las clases para añadir los objetos, al objeto superior.
Gracias a Fox y enekomh por la ayuda :p

Un saudo!
En un evento KeyTipped comopuedo distingir que el boton pulsado sea intro??
zaius5 escribió:En un evento KeyTipped comopuedo distingir que el boton pulsado sea intro??


Dentro de mi ignoracia de Java, normalmente este tipo de eventos trae consigo la tecla que has pulsado. Luego Java tendrá una clase con una colección de teclas y solo es comparar.

Segun veo google, el evento es del tipo KeyEvent y ahi recoges la tecla que has pulsado, solo tendrías que comparar para ver si tu tecla es VK_ENTER.
zaius5 escribió:En un evento KeyTipped comopuedo distingir que el boton pulsado sea intro??

Con los procedimientos del keyEvent puedes extraer el código de la tecla pulsada

He creado un pequeño ejemplo, aprovechando que tengo el Netbeans abierto:

    private void jTextArea1KeyPressed(java.awt.event.KeyEvent evt) {                                     
    if (evt.isActionKey()){
    jTextArea2.append ("Se ha presionado la tecla modificadora " + evt.getKeyModifiersText(evt.getKeyCode()) + "\n Su codigo es " + evt.getKeyCode() + "\n");
    }
    else{
        jTextArea2.append ("Se ha presionado la tecla " + evt.getKeyText(evt.getKeyCode()) +  "\n Su codigo es " + evt.getKeyCode() +"\n");
    }

(He puesto keyPressed pero en realidad KeyTyped es keyPressed + keyReleased, tampoco es importante :p)

(También he puesto un if que verifica si la tecla es una tecla modificadora, lo he hecho solo porque no sé cuales son las teclas modificadoras xD)

Este es el resultado:

Imagen

Esta tarde tengo una prueba de selección para un curso de Hibernate, Spring y JSF! Un mesecico na más y mi currículum será 3 o 4 líneas más largo XD Wish me luck.
Fox escribió:
zaius5 escribió:En un evento KeyTipped comopuedo distingir que el boton pulsado sea intro??


Dentro de mi ignoracia de Java, normalmente este tipo de eventos trae consigo la tecla que has pulsado. Luego Java tendrá una clase con una colección de teclas y solo es comparar.

Segun veo google, el evento es del tipo KeyEvent y ahi recoges la tecla que has pulsado, solo tendrías que comparar para ver si tu tecla es VK_ENTER.

ya lo solucione.
Pero ahora no consigo que cuando maximice o minimice un JFrame se centre el jinternalFrame que contiene,he probado con WindowStateChanged pero no funciona, me explico se como cambiar la posicion para centrarlo pero no consigo que lo haga cuando yo quiero
(mensaje borrado)
Alguien sabe omo hacer un System("clear") en java (o cualquier otro system)?

he estado buscando, y la solucion de escribir linieas en blanco es muy patillera, y si hago

Runtime.getRuntime().exec("clear");

entonces, me lo hace pero no en la consola, me ejecuta este comando pero no me limpia la consola
xgc1986 escribió:Alguien sabe omo hacer un System("clear") en java (o cualquier otro system)?

he estado buscando, y la solucion de escribir linieas en blanco es muy patillera, y si hago

Runtime.getRuntime().exec("clear");

entonces, me lo hace pero no en la consola, me ejecuta este comando pero no me limpia la consola

No se puede hacer eso. La maquina virtual de java no funciona como una ventana DOS, por lo que ni esas instrucciones ni las secuencias de escape ansi funcionan :/
769 respuestas
13, 4, 5, 6, 716